node.jsで使える非同期コントロールフローライブラリ nue その2
asyncblock(https://github.com/scriby/asyncblock)というnode-fiberを使ったライブラリがあります。こちらのREADMEの後半に、pure node版、async版、asyncblock版の比較コードが載っていますが、同等の処理を行うnue版も作ってみました。
次のものです。
var nue = require('nue'); var flow = nue.flow; var parallel = nue.parallel; var fs = require('fs'); flow( parallel( function () { fs.readFile('path1', 'utf-8', this.async()); }, function () { fs.readFile('path2', 'utf-8', this.async()); } ), function (results) { fs.writeFile('path3', results[0] + results[1], 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(); } )();
やっていることとしては、path1とpath2からファイルを同時に読み、両方が読み終わったら連結してpath3に書き込んでいます。書き込みが終わったら読み込んでコンソールに出力しています。
pure node版、async版よりは明らかに簡潔に書けていると思います。でも、asyncblock版と比較するとどうだろう?
asyncblock版のコードをasyncblockのREADMEよりコピペ。
var asyncblock = require('asyncblock'); asyncblock(function(flow){ var first = fs.readFile('path1', 'utf8').defer(); var second = fs.readFile('path2', 'utf8').defer(); fs.writeFile('path3', first + second).sync(); var third = fs.readFile('path3', 'utf8').defer(); console.log(third); console.log('all done'); });
うーん、正直なところ負けているような。。fiberというものを使うと、こんな風にかけるんですね。特に、Using asyncblock + source transformationのすっきりさ加減には驚きました。関数の記述を多用せずに書けるとは。どういう仕組みなのかサンプルコード上からはさっぱりわかっていませんが。今後はfiberが主流になるのかも?(すでになっているのか?)。