co模塊總結

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

相關文章
相關標籤/搜索