私がNodeで使ったライブラリは、しばしばAsync(https://github.com/caolan/async)です。最後に私はこれもブラウザのサポートを持っていることを確認したので、あなたの配布物でこれをnpm/concat/minifyできるはずです。これをサーバー側でのみ使用している場合は、若干改善されたAsyncのバージョンであるhttps://github.com/continuationlabs/insyncを検討してください。一部のブラウザサポートは削除されています。
条件付き非同期呼び出しを使用する際に私が使用する一般的なパターンの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);
};
もちろん、代わりに約束を使用することができます。どちらの場合でも、私は非同期または約束を使用してコールバックの入れ子を避けるのが好きです。
あなたは、ネストされたコールバックを使用しないことによって回避することができ、物事のいくつかのバグを巻き上げ、変数衝突され、「マーチング」コードを読みにくく右>>>>には、など
非同期待つパッケージが役立つかもしれません(シンクスタイルで非同期コードを書くことができ、例外をサポートするなど)https://www.npmjs.com/package/asyncawait - このような構文も今後のNodeバージョンでネイティブにサポートされています(https:// githubを参照)。com/nodejs/promises/issues/4 –