前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大神的自我修养 co.js 的学习

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

作者头像
企鹅号小编
发布2017-12-27 09:47:34
5500
发布2017-12-27 09:47:34
举报
文章被收录于专栏:网络网络

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

就是这么简单……

本文来自企鹅号 - 橙子的前端笔记媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 橙子的前端笔记媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档