co allows you to use generators to manage async flow.

Running generators

co(function * () {
  yield Promise.resolve(true)
}).then(...)

A generator can yield a thunk or promise. Using co() will immediately invoke the block inside it.

Generator → Promise

var fn = co.wrap(function * (val) {
  return yield Promise.resolve(val)
})

fn().then(...)

Use co.wrap(). Most of the time, you’ll be using co.wrap.

Generator → Node callback

var get = unyield(function * () {
})

get(function (err, res) { ... })

Use unyield. (You can thunkify this later)

Node callback → Thunk

var readFile = thunkify(fs.readFile)

co(function * () {
  var data = yield readFile('index.txt', 'utf-8')
})

Use thunkify. You can yield this. You can also use thenify too.

Using 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) => { ... })

Use mz for async Node.js API. You can also either thunkify or thenify them instead.

0 Comments for this cheatsheet. Write yours!