co核心代码剖析--promise与ES6 generator结合

快来围观co@4的核心源码:

function co(gen){
    var ctx=this;
    return new Promise(function(resolve,reject){
        if(typeof gen === 'function')gen=gen.call(ctx);
        if(!gen||typeof gen.next !== 'function')return resolve(gen);
        onFulfilled();
        function onFulfilled(res){
            var ret;
            try{
                ret=gen.throw(err);
            }catch(e){
                return reject(e);
            }
            next(ret);
        }
        function  onRejected(err){
            var ret;
            try{
                ret=gen.throw(err);
            }catch(e){
                return reject(e);
            }
            next(ret);
        }
        function next(ret){
            if(ret.done)return resolve(ret.value);
            var value=toPromise.call(ctx,ret.value);
            if(value && isPromise(value))return value.then(onFulfilled,onRejected);
            return onRejected(new TypeError('you may only yield a function,promise,generator,array,or object',+'but the following object was passed: "'+String(ret.value)+'"'));
        }
    });
}

co将yield后面的表达式全都封装成了Promise对象。Promise(function(resolve,reject)
当前表达式执行结束(即执行promise的then方法)
才会执行fulfilled方法,内部执行gen.next方法。
执行表达式。调用下一个gen.next()。

中间限制了传入参数的数据类型。yield后面只能跟thunk,promise,generator,generatorFunction,array或者object。

return onRejected(new TypeError('you may only yield a function,promise,generator,array,or object',+'but the following object was passed: "'+String(ret.value)+'"'));

1.问题

co把传入参数的上下文改成自己的上下文。

var ctx=this;
...
gen=gen.call(ctx);

所以使用的时候需要bind一个上下文。

2.参考

JavaScript进阶之路——认识和使用Promise,重构你的Js代码 - 雲霏霏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值