Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

「co」はJavaScriptの非同期プログラミングを美しく記述するライブラリ

coはコールバックをしないで済んだりエラー処理がスマートに書かれたりする事で、
非同期プログラミングを美しく魅せるライブラリ……らしいです。
Koaという次々世代WEBフレームワーク*1の根幹を握っている子でもあります。
APIの反応待ちだとかで非同期処理は結構出番がありますが、
そういった諸々で発生する地獄のコールバックネストを、coではyieldで構造を深めずに実現します。

実際のところ

スクリプト

なんの変哲もない、データを変数に格納してコンソールに吐き出す仕様を考えてみます。
実際にはresolveのトコロでAPI叩いたり、処理が重い奴を扱ったりするのでしょう。

var co = require('co');

co(function*(){
  var res = yield [
    Promise.resolve(Date().toLocaleString()),
    Promise.resolve(2)
  ];
  var str = yield Promise.resolve("test");
  console.log(res);

}).catch(onerror);

function onerror(err) {
  // log any uncaught errors
  // co will not throw any errors you do not handle!!!
  // HANDLE ALL YOUR ERRORS!!!
  console.error(err.stack);
};

// >> [ 'Sat Jan 09 2016 23:42:29 GMT+0900 (JST)', 2 ] 'test'

この”function*()”とかいう見慣れない表記はジェネレータ関数というんだそうです。
yieldで呼び出すみたいだし、なんかラムダっぽい
……なんて半端な事いったらマサカリが投擲されてきそうなのでここらへんにしておきます。

*1:知人のコワイエンジニア曰く