最近、お仕事でNode.jsを使っている。Node.jsは、いろいろな処理が非同期処理を前提とした作りとなっており、「ある処理を行った後にする処理」を、「ある処理」を行う関数のコールバック関数として書く必要がある。例えば、ファイルに何か書く場合は、こう。
require('fs'); // ファイルのIOを行うfsモジュール読み込み。
fs.readFile('foo.txt', 'utf8', function(error, data) {
// エラーの場合は、コールバックの第1引数にエラーを表すオブジェクトが入る
if(error) {
console.log("error!");
return;
}
console.log(data); // ファイルの内容
});
わお! ファイルを読むだけで1つコールバック関数が出てきた。
例に挙げたような単純な物ならば特に問題にはならないだろうが、大体のプログラムは、こんなに簡単ではない。ファイルを読んで、DBのAとBとCテーブル読んで、それらでゴニョゴニョした結果を別のファイルに書き込んで、そんな処理が2つも3つも在って……とやっていくと、出来上がるのは深い深ーいコールバック関数の「谷」である。人はコレを「コールバック地獄」と呼ぶとか呼ばないとか。
コレは拙いよね、どうにかしないとね。という訳で使われるのが、async.jsというライブラリ。というか、その中のwaterfall
やseries
か。
この内、waterfall
関数の効果的な使い方が、イマイチよく分からない。