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()を自動で呼び出すのですがその制御もできます。
それらの紹介はまたいずれ。