大神的自我修养 co.js 的学习

最近在项目过程中涉及大量异步流程处理,其中有使用各种流程控制库,大家用的最多的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

欢迎大佬交流前端技术。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171208G0N1C700?refer=cp_1026

扫码关注云+社区