• js设计模式——5.状态模式


    js设计模式——5.状态模式

      

    代码演示

    /*js设计模式——状态模式*/
    
    // 状态(红灯,黄灯,绿灯)
    class State {
        constructor(color) {
            this.color = color;
        }
    
        handle(context) {
            console.log(`turn to ${this.color} light`);
            context.seState(this);
        }
    }
    
    // 主体
    class Context {
        constructor() {
            this.state = null;
        }
    
        getState() {
            return this.state;
        }
    
        seState(state) {
            this.state = state;
        }
    }
    
    // test
    let context = new Context()
    let green = new State('green')
    let yellow = new State('yellow')
    let red = new State('red')
    
    // 绿灯亮了
    green.handle(context)
    console.log(context.getState())
    
    // 红灯亮了
    red.handle(context)
    console.log(context.getState())
    
    // 黄灯亮了
    yellow.handle(context)
    console.log(context.getState())

    引入javascript-state-machine示例

    /*有限状态机*/
    import StateMachine from 'javascript-state-machine'
    import $ from 'jquery'
    
    let fsm = new StateMachine({
        init: '收藏', // 初始化状态,带收藏
        transitions : [
            {
                name : 'doState',
                form : '收藏',
                to : '取消收藏'
            },
            {
                name : 'deleteState',
                form : '取消收藏',
                to : '收藏'
            }
        ],
        methods : {
            // 执行收藏
            onDoState : function () {
                alert('收藏成功')
                updateText()
            },
    
            // 取消收藏
            onDeleteState: function () {
                alert('已取消收藏')
                updateText()
            }
        }
    })
    
    let $btn = $('btn1')
    
    $btn.click(function () {
        if(fsm.is('收藏')){
            fsm.doState()
        } else {
            fsm.deleteState()
        }
    })
    
    // 更新方案
    function updateText() {
        $btn.text(fsm.state)
    }
    // 初始化方案
    updateText()
    

    以promise示例来演示

    // promise 状态机模型
    import StateMachine from 'javascript-state-machine';
    
    let prmiseFsm = new StateMachine({
        init: 'pending', // 初始化状态
        transitions: [
            {
                name: 'resolve',
                from: 'pending',
                to: 'fullfilled',
            },
            {
                name: 'reject',
                from: 'pending',
                to: 'rejected',
            },
        ],
        methods: {
            // 监听 resolve
            onResolve: function (state, data) {
                // state —— 当前状态机示例 data - fsm.resolve(xxx) 传递的参数
                data.succesList.forEach(fn => fn())
            },
    
            // 监听 reject
            onReject: function (state, data) {
                // state —— 当前状态机示例 data - fsm.reject(xxx) 传递的参数
                data.failList.forEach(fn => fn())
            },
    
        },
    });
    
    // 定义 Promise
    class MyPromise {
        constructor(fn) {
            this.succesList = []
            this.failList = []
    
            fn(function () {
                // resolve 函数
                fsm.resolve(this)
            }, function () {
                // reject 函数
                fsm.reject(this)
            });
        }
    
        then(succesFn, failFn) {
            this.succesList.push(succesFn)
            this.failList.push(failFn)
        }
    }
    
    // 测试代码
    function loadImg(src) {
        const promise = new Promise(function (resolve, reject) {
            let img = document.createElement('img');
            img.onload = function () {
                resolve(img);
            };
            img.onerror = function () {
                reject();
            };
            img.src = src;
        });
        return promise;
    }
    
    let src = 'http://img2.imgtn.bdimg.com/it/u=234634259,4236876085&fm=26&gp=0.jpg';
    let result = loadImg(src);
    
    result.then(function () {
        console.log('ok1');
    }, function () {
        console.log('fail1');
    });
    
    result.then(function () {
        console.log('ok2');
    }, function () {
        console.log('fail2');
    });
    

      

  • 相关阅读:
    浏览器是怎样工作的二:渲染引擎 HTML解析(1)(转)
    凯文.都迪的超级记忆力训练教程
    程序员的修炼之道
    我编程我快乐——程序员的职业规划
    SQL Server 数据库备份和还原认识和总结(一)
    SQL Server 管理数据收集
    汇总SQL Server里的相关运算符、子句、谓词等
    SQL Server 数据库备份和还原认识和总结(二)
    解决报表控件报CS0433错误
    通过笔记本配件,理解抽象类接口和委托事件
  • 原文地址:https://www.cnblogs.com/hpx2020/p/10723681.html
Copyright © 2020-2023  润新知