node.js v0.8.3
undersore.js 1.4.3
node.js のプログラムで、複数の非同期処理の終了を待ってから後続の処理を実行する場合、underscore.js の after 関数がとても便利だったので紹介します。
underscore.js のインストール
$ npm install underscore
after 関数
underscore.js の after 関数では、第1引数で渡した数値回、戻り値で返す関数が実行されると、第2引数のコールバックが実行されます、、といってもよくわからないので、
例として、複数のファイルを非同期で削除し、すべてのファイルの削除が完了したらメッセージを表示するプログラムを作成しました。
//カレントディレクトリの、foo, bar, hoge というファイルを非同期で削除する。 //すべてのファイルの削除が完了したら、コンソールにメッセージを表示する。 var fs = require('fs'), _ = require('underscore') var targets = ['foo', 'bar', 'hoge']; //ファイルの削除を待ち受ける関数 var displayResult = _.after(targets.length, function(){ console.log('ファイルの削除が完了しました。'); }); _.each(targets, function(target){ fs.exists(target, function(exists){ if(exists){ fs.unlink(target, function(err){ if(err) throw err; console.log(target + " を削除しました。"); displayResult(); //ファイルの削除を通知 }); } else { displayResult(); //ファイルの削除を通知 } }); }); console.log('最初にここが実行されます。');
実行結果
最初にここが実行されます。 hoge を削除しました。 bar を削除しました。 foo を削除しました。 ファイルの削除が完了しました。
想定通りの順番で処理が実行されました!
しかし、上記のサンプルを見てもお分かりの通り、こんなに短いプログラムでも、処理が行ったり来たりしていて、もうスパゲッティ化の兆候が現れはじめてます。。
複数の非同期処理を制御する場合は、かなり慎重にプログラミングする必要がありますね。
でも、after だけでなく、underscore.js には、便利な関数(extend, each, map など)がたくさん用意されているので、積極的に利用していこうと思います。
まとめ
- 複数の非同期処理の完了を待ち受ける場合は、 underscore.js の after 関数が便利。
- コードのスパゲッティ化には十分注意する!
0 件のコメント:
コメントを投稿