Często używaną biblioteką w węźle jest Async (https://github.com/caolan/async). Ostatnio sprawdziłem, czy ma również obsługę przeglądarki, więc powinieneś móc npm/concat/minify tego w swojej dystrybucji. Jeśli używasz tego tylko po stronie serwera, powinieneś wziąć pod uwagę https://github.com/continuationlabs/insync, która jest nieco ulepszoną wersją Async, z usuniętą obsługą niektórych przeglądarek.
Jednym z typowych wzorców, których używam podczas używania warunkowych wywołań asynchronicznych, jest wypełnienie tablicy funkcjami, których chcę użyć w kolejności, i przekazanie ich do async.waterfall.
Podałem przykład poniżej.
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);
};
Oczywiście można użyć obietnic. W obu przypadkach lubię unikać wywoływania zwrotnego zagnieżdżania za pomocą asynchronizacji lub obietnic.
Niektóre rzeczy można uniknąć nie używając zagnieżdżone wywołania zwrotne są zmienne kolizji, podnoszące bugs „marszowa” w prawo>>>>, trudne do odczytania kodu, itp
asynchroniczny-czeka pakiet może pomóc (pozwala pisać kod asynchroniczny w stylu synchronizacji, obsługuje wyjątki itp.) https://www.npmjs.com/package/asyncawait - taka składnia będzie również natywnie obsługiwana w przyszłych wersjach Węzłów, zobacz https: // github.com/nodejs/promises/issues/4 –