co模組總結

看風景就發表於2017-08-31

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

相關文章