node.jsで使える非同期コントロールフローライブラリ nue その1
最近作っています(https://github.com/nakamura-to/nue)。だいたいできてきたんですが、ドキュメントが大変、というか英語が書けなくて苦しみ中です。。気分転換にブログで紹介します。
nueはnpmでインストールできます。現時点のバージョンは0.0.4。
npm install nue
こんな感じで使います。(hello.txtには「Hello World」というテキストが入っています)
var nue = require('nue'); var flow = nue.flow; var fs = require('fs'); flow( function (arg) { console.log('1: ' + arg); this.next('nextで次の関数を呼び出す。値も渡せる。'); }, function (value) { console.log('2: ' + value); fs.readFile('hello.txt', this.async('asyncはコールバック関数を戻す。次の関数へ値も渡せる。')); }, function (description, data) { console.log('3: ' + description + ': ' + data); this.next(); }, function () { if (this.err) throw this.err; console.log('4: 終わり。'); this.next(); } )('パラメータに値を渡せる。');
実行結果はこうなります。
1: パラメータに値を渡せる。 2: nextで次の関数を呼び出す。値も渡せる。 3: asyncはコールバック関数を戻す。次の関数へ値も渡せる。: Hello World 4: 終わり。
this.next()とかthis.async()とかthis.errとかがポイントです。
this.next()はパラメータを指定して次の関数に制御を移します。
this.async()はコールバック関数を返します。this.async()を使った場合、次に制御が移る関数のパラメータにはthis.async()の引数とコールバック関数の第2引数以降の値が渡されます。
コールバック関数の第1引数がtruthyの場合、一番最後の関数にジャンプします。そのとき、this.errにコールバック関数の第1引数が設定されます。
この例には載せていませんが、this.end()でいつでも自由に一番最後の関数にジャンプすることもできます。
mapとかfillterとかもできます。
var nue = require('nue'); var flow = nue.flow; var map = nue.map; var filter = nue.filter; flow( function () { console.log('1: 複数の値をmapで変換しfilterで選択'); this.next(1, 2, 3); }, map(function (value) { console.log('2: value=' + value); this.next(value * 2); }), filter(function (value) { console.log('3: value=' + value); this.next(value > 5); }), function (results) { if (this.err) throw this.err; console.log('4: ' + results); this.next(); } )();
実行結果
1: 複数の値をmapで変換しfilterで選択 2: value=1 2: value=2 2: value=3 3: value=2 3: value=4 3: value=6 4: 6
parallelとかparallelMapとかparallelFilterとかもあります。nueは適度な粒度でprocess.nextTick()を自動で呼び出すのですがその制御もできます。
それらの紹介はまたいずれ。