co核心代码剖析--promise与ES6 generator结合
2016-06-17 16:51
323 查看
快来围观co@4的核心源码:
co将yield后面的表达式全都封装成了Promise对象。
当前表达式执行结束(即执行promise的then方法)
才会执行fulfilled方法,内部执行gen.next方法。
执行表达式。调用下一个gen.next()。
中间限制了传入参数的数据类型。yield后面只能跟thunk,promise,generator,generatorFunction,array或者object。
所以使用的时候需要bind一个上下文。
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代码 - 雲霏霏相关文章推荐
- 从源码安装Mysql/Percona 5.5
- 浅析Ruby的源代码布局及其编程风格
- asp.net 抓取网页源码三种实现方法
- JS小游戏之仙剑翻牌源码详解
- JS小游戏之宇宙战机源码详解
- jQuery源码分析之jQuery中的循环技巧详解
- 本人自用的global.js库源码分享
- java中原码、反码与补码的问题分析
- ASP.NET使用HttpWebRequest读取远程网页源代码
- PHP网页游戏学习之Xnova(ogame)源码解读(六)
- C#获取网页HTML源码实例
- PHP网页游戏学习之Xnova(ogame)源码解读(八)
- PHP网页游戏学习之Xnova(ogame)源码解读(四)
- 深入理解PHP之源码目录结构与功能说明
- JS小游戏之极速快跑源码详解
- JS小游戏之象棋暗棋源码详解
- android源码探索之定制android关机界面的方法
- 基于Android设计模式之--SDK源码之策略模式的详解
- Android游戏源码分享之2048
- C语言借助EasyX实现的生命游戏源码