1.thunk函数javascript
javascript中的thunk函数就是一个单参数函数,且该参数必须是一个callback函数,callback的签名必须为callback(err,args...);java
所谓的thunkify就是将一个多参数函数转化为一个thunk函数,该多参数函数必须有一个callback做为参数。数组
2. Promsiepromise
co模块在4.x开始使用Promise,将全部的值(常量、thunk函数等)都转化为Promise,用Promise的then完成回调,co的基本原理,仍是在async
promise的resolve和reject中递归的调用generator的next方法,直至generator的done为true函数
3. yeild学习
co模块的yeild后面能够跟array或object,其中的promise会并行执行ui
4.co的模块导出spa
co的模块导出代码颇有表明性,值得学习code
module.exports = co['default'] = co.co = co;
这种方式的好处是能够知足下面这些导入方式
var co = require('co') var wrap = co.wrap require('co').co import co from 'co' import { wrap, co } form 'co' import * as co from 'co'
5.co.wrap
var fn = co.wrap(fn*)
将一个generator转化为一个返回promise的常规函数
co(fn*).then
将一个generator解决为一个promise
co.wrap应用于须要普通回调函数的地方,如数组的 forEach 、 reduce 等,
事件注册和Node中大多数API都须要普通的回调函数的地方
function asyncFn(num, time) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve('data: ' + num) }, time) }) } var res = [1, 2, 3].forEach(co.wrap(function*(item, i) { var d = yield asyncFn(item, i * 1000) console.log(d) }))
其实并无真正的转换,而是直接执行的co()函数,并将forEach回调的参数传递给了Generator函数。
参考:http://www.tuicool.com/articles/ym6b22V