简单模拟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
*/

 

posted @ 2017-11-18 17:18  jyf-blog  阅读(176)  评论(0编辑  收藏  举报