本文根据 Devhints / co 翻译。代码示例及版本范围沿用原文。原文标注更新日期:2017-10-27。
co 允许您使用生成器(generator)来管理异步流程。
运行生成器
co(function * () {
yield Promise.resolve(true)
}).then(...)
生成器可以 yield 一个 thunk(延迟执行函数)或 Promise。使用 co() 会立即调用其内部的代码块。
生成器 → Promise
var fn = co.wrap(function * (val) {
return yield Promise.resolve(val)
})
fn().then(...)
使用 co.wrap()。大多数情况下,您会使用 co.wrap。
生成器 → Node 回调(callback)
var get = unyield(function * () {
})
get(function (err, res) { ... })
使用 unyield。(您可以 thunkify 稍后进行此操作)
Node 回调 → Thunk
var readFile = thunkify(fs.readFile)
co(function * () {
var data = yield readFile('index.txt', 'utf-8')
})
使用 thunkify。您可以 yield(产出)它。您也可以使用 thenify 。
使用 Node.js API
var readFile = require('mz/fs').readFile
var getLines = co.wrap(function * (filename) {
var data = yield readFile(filename, 'utf-8')
return data.split('\n')
})
getLines('file.txt').then((lines) => { ... })