1.thunk函式
javascript中的thunk函式就是一個單引數函式,且該引數必須是一個callback函式,callback的簽名必須為callback(err,args...);
所謂的thunkify就是將一個多引數函式轉化為一個thunk函式,該多引數函式必須有一個callback作為引數。
2. Promsie
co模組在4.x開始使用Promise,將所有的值(常量、thunk函式等)都轉化為Promise,用Promise的then完成回撥,co的基本原理,還是在
promise的resolve和reject中遞迴的呼叫generator的next方法,直至generator的done為true
3. yeild
co模組的yeild後面可以跟array或object,其中的promise會並行執行
4.co的模組匯出
co的模組匯出程式碼很有代表性,值得學習
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