私がNodeで頻繁に使用しているライブラリは、Async(https://github.com/caolan/async)です。最後に、これがブラウザもサポートしていることを確認したので、ディストリビューションでこれをnpm / concat/minifyできるはずです。これをサーバー側でのみ使用している場合は、 https://github.com/continuationlabs/insyncを検討する必要があります。これは、ブラウザのサポートの一部が削除された、Asyncのわずかに改善されたバージョンです。
条件付き非同期呼び出しを使用するときに使用する一般的なパターンの1つは、順番に使用する関数を配列に入力し、それをasync.waterfallに渡すことです。
以下に例を示します。
var tasks = [];
if (conditionOne) {
tasks.push(functionOne);
}
if (conditionTwo) {
tasks.push(functionTwo);
}
if (conditionThree) {
tasks.push(functionThree);
}
async.waterfall(tasks, function (err, result) {
// do something with the result.
// if any functions in the task throws an error, this function is
// immediately called with err == <that error>
});
var functionOne = function(callback) {
// do something
// callback(null, some_result);
};
var functionTwo = function(previousResult, callback) {
// do something with previous result if needed
// callback(null, previousResult, some_result);
};
var functionThree = function(previousResult, callback) {
// do something with previous result if needed
// callback(null, some_result);
};
もちろん、代わりにPromiseを使用することもできます。どちらの場合も、asyncまたはpromiseを使用してコールバックをネストしないようにします。
ネストされたコールバックを使用しないことで回避できることのいくつかは、変数の衝突、バグの巻き上げ、右への「行進」>> >>、読みにくいコードなどです。