node.jsで使える非同期コントロールフローライブラリ nue その3

どうやら僕は間違った方向に進んでいたようです。シンプルに考え直してみると、parallelとかmapとかfilterとかいらない。もっとシンプルに非同期コールバックの待ち合わせに焦点を当てたほうが使いやすくなるはず。

コードの1/3以上を捨てて、その2で示したサンプルを次のように書けるようにしました(v0.0.7で)。javascriptcoffeescriptの両方で書いてみました。

javascript
var flow = require('nue').flow;
var fs = require('fs');

flow(
  function () {
    fs.readFile('path1', 'utf-8', this.async());
    fs.readFile('path2', 'utf-8', this.async());
  },
  function (data1, data2) {
    fs.writeFile('path3', data1 + data2, this.async());
  },
  function () {
    fs.readFile('path3', 'utf-8', this.async());
  },
  function (data) {
    if (this.err) throw this.err;
    console.log(data);
    console.log('all done');
    this.next();
  }
)();
coffee script
flow = require('nue').flow
fs = require('fs')

flow(
  () -> 
    fs.readFile('path1', 'utf-8', @async())
    fs.readFile('path2', 'utf-8', @async())
  (data1, data2) -> 
    fs.writeFile('path3', data1 + data2, @async());
  () -> 
    fs.readFile('path3', 'utf-8', @async());
  (data) ->
    if @err? then throw @err
    console.log(data)
    console.log('all done')
    @next()
)()

悪くない。個人的にはasyncblockよりこの方法がわかりやすい。asyncblockやnode-fibersは魔法のように見えてしまうのが問題だと思う。慣れの問題かもしれないけど。


asyncblockのいいところは、非同期処理前と非同期処理後のコードで同じ関数スコープを共有できることだと思いますが、nueの場合は関数(スコープ)が分かれてしまいます。この問題については次のエントリで。