コールバックシンドロームのレイヤーの修正に役立つ多数のライブラリがあります。
実際、多すぎますが、どれを使用しますか?
Async.js を使用します。
Asyncは、非同期JavaScriptを操作するための簡単で強力な機能を提供するユーティリティモジュールです。もともとはnode.jsで使用するために設計されましたが、ブラウザーで直接使用することもできます。
例
async.map(['file1','file2','file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
async.filter(['file1','file2','file3'], path.exists, function(results){
// results now equals an array of the existing files
});
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
]);
Qからの約束 を使用したい:
関数がブロックせずに値を返すことも例外をスローすることもできない場合は、代わりにpromiseを返すことができます。 promiseは、関数が最終的に提供する可能性がある戻り値またはスローされた例外を表すオブジェクトです。 promiseは、レイテンシを克服するためのリモートオブジェクトのプロキシとしても使用できます。
最初のパスでは、プロミスは「運命のピラミッド」を緩和することができます。これは、コードが前に進むよりも速く右に進む状況です。
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
Promiseライブラリを使用すると、ピラミッドをフラット化できます。
Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
// Do something with value4
}, function (error) {
// Handle any error from step1 through step4
})
.done();
このアプローチを使用すると、try、catch、およびfinalと同様に、暗黙的なエラー伝搬も行われます。ステップ1のエラーはステップ5に流れ、そこでキャッチされて処理されます。
コールバックアプローチは、「制御の反転」と呼ばれます。戻り値の代わりにコールバックを受け入れる関数は、「私に電話しないで、私が電話します。」と言っています。入力引数を制御フロー引数から明確に分離して、反転を解除しないことを約束します。これにより、APIの使用と作成が簡単になり、特に可変引数、休憩、拡散引数が簡素化されます。
他の同期ライブラリでの問題は、最初にすべてのタスクを定義する必要があり、見つけたわかりやすい直感的なAPIが提供されていないことが多かったことです。いつでもどこでもグループにタスクをプッシュし、そのグループを並列または直列のいずれかの方法で実行したいだけです。
私は TaskGroup 内のフロー機能が大好きで、DocPadや BugHerd を含む多くの大きなプロジェクトに使用しました。 例はREADMEにあります。