大神的自我修养 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 两个方法的实现:

就是这么简单……

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

编译选项含义

编译选项: 现在我们Makefile中的编译选项有: ? -g :可执行程序包含调试信息;(给gdb调试使用) -O2:该优化选项会牺牲部分编译速度,除了执行-...

3706
来自专栏小詹同学

Python 4 种不同的存取文件骚操作

前言:最近开始学习tensorflow框架,选修课让任选一种框架实现mnist手写数字的识别分类。小詹也就随着大流选择了 tf 框架,跟着教程边学边做,小詹用了...

1213
来自专栏蓝天

Shell 条件判断汇总

-b file            若文件存在且是一个块特殊文件,则为真 -c file            若文件存在且是一个字符特殊文件,则为真 -d ...

592
来自专栏西枫里博客

TP5中paginate方法丢失url参数的问题

一个简单的应用场景。现在需要在后台对用户产品数据进行搜索,可以对产品名称使用模糊检索,也可以使用产品类别进行分类搜索。因为搜索条件是两个表单项,所以简单了区分搜...

341
来自专栏互联网杂技

express中app.use和app.get的区别及解析

写在前面:最近研究nodejs及其web框架express,对app.use和app.get没理解清,以致踩了坑浪费不少时间,我根据自己实践及总结出此博客,若有...

3416
来自专栏Java职业技术分享

使用Python这么多年,才发现Python还有这些实用的功能和特点

在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Pytho...

1163
来自专栏从流域到海域

《笨办法学Python》 第2课手记

《笨办法学Python》 第2课手记 这节课的内容很简单,目的是要探求#号的作用,目前我们已知的内容是,作为注释的标识符。 在Python中输入如下代码并运行。...

1818
来自专栏PPV课数据科学社区

工具 | 如何在Python中调用R语言包?

R语言是非常强大的做统计分析和建模方面的开源软件,它有非常丰富的统计软件包,做统计可以说只有你想不到的,没有R办不到的。Python又是当下最流行的编程软件之一...

4688
来自专栏小樱的经验随笔

【批处理学习笔记】第三课:简单批处理命令(2)

cls 命令     清除屏幕。执行该命令后,屏幕上的所有信息都被清除,光标重新定位至屏幕左上角。 REM 和 :: REM为注释命令,一般用来给程序加上注...

3104
来自专栏DannyHoo的专栏

IOS中的字典转模型2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

533

扫码关注云+社区