简单模拟CO模块

Posted Lorem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单模拟CO模块相关的知识,希望对你有一定的参考价值。

promise方式:

// 对co模块的简单模拟

function run(gen){
    var g = gen();
    function next(data){
        var result = g.next(data);
        if (result.done) return result.value;
        result.value.then(function(data){
            next(data);
        });
    }
    next();
}

function a(aa){
    return new Promise(function (resolve, reject){
        setTimeout(function (){
            console.log(aa);
            resolve(‘dataA‘);
        }, 1000);
    });
}

function b(bb){
    return new Promise(function (resolve, reject){
        setTimeout(function (){
            console.log(bb);
            resolve(‘dataB‘);
        }, 1000);
    });
}

function *gen(){
    console.log(yield a(‘aa‘));
    console.log(yield b(‘bb‘));
}

run(gen);

/*
等一秒
aa
dataA
等一秒
bb
dataB
*/

thunk方式:

// 对co模块的简单模拟

function run(fn) {
    var gen = fn();
    function next(err, data) {
        var result = gen.next(data);
        if (result.done) return;
        result.value(next);
    }
    next();
}

var Thunk = function(fn){
    return function(...args){
        return function(callback){
            return fn.call(this, ...args, callback);
        };
    };
};

function a(aa, cb){
    setTimeout(function (){
        console.log(aa);
        cb(null, ‘dataA‘);
    }, 1000);
}

function b(bb, cb){
    setTimeout(function (){
        console.log(bb);
        cb(null, ‘dataB‘);
    }, 1000);
}

var aThunk = Thunk(a);
var bThunk = Thunk(b);

function *gen(){
    console.log(yield aThunk(‘aa‘));
    console.log(yield bThunk(‘bb‘));
}

run(gen);

/*
等一秒
aa
dataA
等一秒
bb
dataB
*/

 

以上是关于简单模拟CO模块的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RequireJS 中模拟单元测试的依赖项?

nodejs常用代码片段

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

Xcode 快速开发 代码块

sublime text 3 添加 javascript 代码片段 ( snippet )

如何用python-control(IVP问题)模拟系统传递函数的时间响应?