Was ist der Unterschied zwischen async.waterfall und async.series

Antworten:

168

Es scheint, async.waterfalldass jede Funktion ihre Ergebnisse an die nächste Funktion weitergeben kann, während async.seriesalle Ergebnisse an den endgültigen Rückruf übergeben werden. Auf einer höheren Ebene async.waterfallwäre dies für eine Datenpipeline ("2 gegeben, mit 3 multiplizieren, 2 addieren und durch 17 dividieren"), während async.seriesdies für diskrete Aufgaben wäre, die in der richtigen Reihenfolge ausgeführt werden müssen, aber ansonsten getrennt sind.

Twisol
quelle
Kann eine dieser beiden Funktionen einen Wert zurückgeben? Ich habe gelesen, dass dies möglich ist, aber ich kann keine relevanten Informationen in der Dokumentation finden.
Anderson Green
1
@ AndersonGreen: Nein. Mit Blick auf die Bibliothek Quelle, weder waterfallnoch serieseinen Wert zurückgibt. Es wird erwartet, dass das Ergebnis im optionalen Rückrufparameter verwendet wird.
Twisol
Die obige Antwort mag bis 2012 korrekt sein, aber die richtige ist die gleiche wie die nächste, nämlich: series (), da ALL als Ergebnisse bezeichnet wird, die an den Final Callback übergeben werden, und waterfall das LETZTE Ergebnis, an das übergeben wird der letzte Rückruf. Siehe Mozilla Developer
Jeb50
53

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.


quelle
1
Dies sollte die Antwort sein ;-)
Stuart Allen
@Mario "Beide Funktionen übergeben den Rückruf der vorherigen Funktion" ODER "Beide Funktionen übergeben das Ergebnis der vorherigen Funktion"?
user1451111
@ user1451111, Ergebnis, lol ... Ich bin sicher, ich hatte das das erste Mal geschrieben ...
26

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

Wayne Chiu
quelle
1
Fantastisch erstellte Bilder. Hast du sie selbst erstellt oder woanders bekommen?
user1451111
Sie sollten die Bilder in die Antwort setzen, die Leute werden sie wahrscheinlich vermissen o / w
Alexander Mills
1

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.autoInjectals 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!

Alexander Mills
quelle