最近在项目过程中涉及大量异步流程处理,其中有使用各种流程控制库,大家用的最多的async,号称promise性能超原生的bluebird,还有tj大神的co.js等。可以说是相当多了,于是空暇期间来整理一下promise的学习。
今天来看的就是TJ大神的非常精炼的 co.js 。
先看用法
yield支持
co最方便的操作也就是yield的支持,现在支持yield的对象有:
promises
thunks (functions)
array (parallel execution)
objects (parallel execution)
generators (delegation)
generator functions (delegation)
下文在源码里有体现。
一个官网的小例子
看源码
wrap 函数的实现
大神写的代码就是十分的精炼,wrap 函数的实现也只是7行代码而已。
其实有两点需要注意的,就是:
1.没有写在原型链上而是作为一个私有方法是为了避免每次执行`co()`的时候生成一个新的wrap方法,这个方法显然没必要。
2.关键在于返回了一个co(),因为co()会 return 一个 promise,即生成一个新的promise。同时利用 call 和 apply 改变了 this 的指向,指向 co 。
并行多个promise
其实 co 方法的主体不用细看,基本就是按照 es6 promise 的一种重写。这里需要注意的一点就是并行支持promise。即,当 yield 一个 object 或者 array 的时候,并行执行多个 promise。
一开始当我听到并行的时候,是有点懵的,但看到源码的时候发现没有想得那么复杂,其实就是 promise 的原生方法的功劳:promise.all(),可以往下看。。。
这里的 toPromise() 是在 next 方法的实现中执行的,关键的代码就两句:
然后,就是 arrayToPromise 和 objectToPromise 两个方法的实现:
就是这么简单……
庐山真面目,真正的源码:https://github.com/tj/co/blob/master/index.js
欢迎大佬交流前端技术。