Das asynchrone Modul von nodejs: https://github.com/caolan/async bietet zwei ähnliche Methoden: async.waterfall
und async.series
.
Was ist der Unterschied zwischen ihnen?
Das asynchrone Modul von nodejs: https://github.com/caolan/async bietet zwei ähnliche Methoden: async.waterfall
und async.series
.
Was ist der Unterschied zwischen ihnen?
Antworten:
Es scheint, async.waterfall
dass jede Funktion ihre Ergebnisse an die nächste Funktion weitergeben kann, während async.series
alle Ergebnisse an den endgültigen Rückruf übergeben werden. Auf einer höheren Ebene async.waterfall
wäre dies für eine Datenpipeline ("2 gegeben, mit 3 multiplizieren, 2 addieren und durch 17 dividieren"), während async.series
dies für diskrete Aufgaben wäre, die in der richtigen Reihenfolge ausgeführt werden müssen, aber ansonsten getrennt sind.
waterfall
noch series
einen Wert zurückgibt. Es wird erwartet, dass das Ergebnis im optionalen Rückrufparameter verwendet wird.
Beide Funktionen übergeben den Rückgabewert jeder Funktion an die nächste. Wenn dies erledigt ist, wird der Hauptrückruf aufgerufen und der Fehler übergeben, falls ein Fehler auftritt.
Der Unterschied besteht darin async.series()
, dass nach Abschluss der Serie alle Ergebnisse an den Hauptrückruf übergeben werden. async.waterfall()
Übergibt nur das Ergebnis der zuletzt aufgerufenen Funktion an den Hauptrückruf.
async.waterfall()
befasst sich mit einem action that relies on the previous outcome
.
async.series()
befasst sich mit einer Aktion, die will see all the result at the end
Ich halte async.waterfall für schädlich, da es schwierig ist, einmal geschriebene und fehleranfällige Änderungen vorzunehmen, da andere Funktionen die Signatur stark ändern, wenn Sie mehr Argumente angeben.
Ich kann es async.autoInject
als großartige Alternative zu async.waterfall nur empfehlen.
https://caolan.github.io/async/autoInject.js.html
Wenn Sie sich für die Verwendung von async.waterfall entscheiden, empfehle ich, alles in einem Objekt zu speichern, damit Ihre Funktionen Länge / Signaturen nicht wie folgt ändern müssen:
Warnung: Dies ist ein schlechtes Muster
async.waterfall([
cb => {
cb(null, "one", "two");
},
(one, two, cb) => {
cb(null, 1, 2, 3, 4);
},
(one,two,three,four,cb) => {
// ...
}
])
Mach es nicht so. Dies ist ein viel besseres Muster :
async.waterfall([
cb => {
cb(null, {one:"one", two:"two"});
},
(v, cb) => {
cb(null, [1, 2, 3, 4]);
},
(v,cb) => {
// ...
}
])
Auf diese Weise werden Sie sich nicht die Haare ausreißen, um sicherzustellen, dass die Funktionsargumente die richtige Länge haben. Die erste Funktion akzeptiert nur einen Arg-Callback. Alle übrigen sollten zwei Argumente akzeptieren - einen Wert und einen Rückruf. Halten Sie sich an das Muster und Sie bleiben gesund!