node.jsで使える非同期コントロールフローライブラリ nue その3
どうやら僕は間違った方向に進んでいたようです。シンプルに考え直してみると、parallelとかmapとかfilterとかいらない。もっとシンプルに非同期コールバックの待ち合わせに焦点を当てたほうが使いやすくなるはず。
コードの1/3以上を捨てて、その2で示したサンプルを次のように書けるようにしました(v0.0.7で)。javascriptとcoffeescriptの両方で書いてみました。
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の場合は関数(スコープ)が分かれてしまいます。この問題については次のエントリで。