クイックリファレンス

co Generator 非同期フロー制御チートシート

Node.js向けGeneratorベースの非同期制御ライブラリ「co」のクイックリファレンス:実行構文、co.wrap、Thunk連携、並行実行。

· 公開日

co co は、現代の JavaScript / Node.js における async/await 構文の基礎を築いた、Generator ベースの先駆的非同期フロー制御ライブラリです。

Generator 関数の自動実行

const co = require('co');

co(function* () {
  const result = yield Promise.resolve(42);
  return result * 2;
}).then(val => {
  console.log(val); // 84
}).catch(err => {
  console.error(err);
});

Generator 内で Promise、Thunk、配列、オブジェクトを yield できます。co() を呼び出すと、最後まで自動で反復処理が実行されます。


Generator を再利用可能な Promise 関数化 (co.wrap)

Generator 関数をラップし、通常の Promise を返す標準関数に変換します(現代の async function と同等の振る舞い):

const getUser = co.wrap(function* (id) {
  const user = yield db.users.findById(id);
  const posts = yield db.posts.findByUser(user.id);
  return { user, posts };
});

// 呼び出すと通常の Promise が返却されます:
getUser(123).then(data => {
  console.log(data);
});

従来の Node.js コールバック API との連携

thunkify や各種 Promisify ラッパーを活用したコールバックの呼び出し:

const thunkify = require('thunkify');
const fs = require('fs');

const readFile = thunkify(fs.readFile);

co(function* () {
  const content = yield readFile('config.json', 'utf8');
  console.log(JSON.parse(content));
});

並行実行(配列とオブジェクト)

co(function* () {
  // 配列内の処理を並行(Promise.all 相当)で解決
  const [user, profile] = yield [fetchUser(), fetchProfile()];

  // オブジェクトの各プロパティを並行で解決
  const data = yield {
    user: fetchUser(),
    profile: fetchProfile()
  };
  console.log(data.user, data.profile);
});

関連テーマ