码迷,mamicode.com
首页 > 其他好文 > 详细

简单模拟CO模块

时间:2017-11-18 18:43:42      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:模块   func   thunk   next   bsp   settime   turn   reject   llb   

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模块

标签:模块   func   thunk   next   bsp   settime   turn   reject   llb   

原文地址:http://www.cnblogs.com/jyuf/p/7857405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!