Jaka jest różnica między async.waterfall i async.series

Odpowiedzi:

168

Wydaje się, że async.waterfallumożliwia każdej funkcji przekazanie wyników do następnej funkcji, podczas gdy async.serieswszystkie wyniki przekazuje do końcowego wywołania zwrotnego. Na wyższym poziomie async.waterfallbyłoby to dla potoku danych („biorąc pod uwagę 2, pomnóż to przez 3, dodaj 2 i podziel przez 17”), podczas gdy async.seriesbyłoby to dla zadań dyskretnych, które muszą być wykonywane po kolei, ale poza tym są oddzielne.

Twisol
źródło
Czy jedna z tych dwóch funkcji może zwrócić wartość? Czytałem, że jest to możliwe, ale nie mogę znaleźć odpowiednich informacji w dokumentacji.
Anderson Green
1
@AndersonGreen: Nie. Patrząc na źródło biblioteki, ani waterfallani nie serieszwraca wartości. Oczekuje się, że niezależnie od wyniku zostanie użyty w opcjonalnym parametrze wywołania zwrotnego.
Twisol
Powyższa odpowiedź może być poprawna z powrotem do 2012 r., Ale poprawna jest taka sama jak następna, czyli: series (), ponieważ nazywa się WSZYSTKIE wyniki jako seria przekazana do wywołania zwrotnego Final, a wodospad to OSTATNI wynik przekazany do ostateczne oddzwonienie. Zobacz Mozilla Developer
Jeb50,
53

Obie funkcje przekazują wartość zwracaną przez każdą funkcję do następnej, a po wykonaniu wywołania wywołania głównego, przekazując jego błąd, jeśli wystąpi błąd.

Różnica polega na tym async.series(), że po zakończeniu serii wszystkie wyniki zostaną przekazane do głównego wywołania zwrotnego. async.waterfall()przekaże do głównego wywołania zwrotnego tylko wynik ostatniej wywołanej funkcji.


źródło
1
To powinna być odpowiedź ;-)
Stuart Allen
@Mario "Obie funkcje przekazują wywołanie zwrotne poprzedniej funkcji" LUB "Obie funkcje przekazują wynik poprzedniej funkcji"?
user1451111
@ user1451111, Result, lol ... Jestem pewien, że napisałem, że za pierwszym razem ...
26

async.waterfall()ma do czynienia z action that relies on the previous outcome.

async.series() ma do czynienia z działaniem, które chce see all the result at the end

Wayne Chiu
źródło
1
Niesamowicie stworzone obrazy. Czy stworzyłeś je sam, czy masz je gdzieś indziej?
user1451111
należy wstawić zdjęcia w odpowiedzi, ludzie prawdopodobnie będą za nimi tęsknić o / w
Alexander Mills
1

Uważam, że async.waterfall jest szkodliwy, ponieważ po napisaniu ciężko jest refaktoryzować, a także jest podatny na błędy, ponieważ jeśli podasz więcej argumentów, inne funkcje znacznie zmieniają sygnaturę.

Gorąco polecam async.autoInjectjako świetną alternatywę dla async.waterfall. https://caolan.github.io/async/autoInject.js.html

Jeśli zdecydujesz się użyć async.waterfall, zalecam przechowywanie wszystkiego w jednym obiekcie, aby Twoje funkcje nie musiały zmieniać długości / podpisów, na przykład:

ostrzeżenie: to zły wzór

async.waterfall([
  cb => {
    cb(null, "one", "two");
  },
  (one, two, cb) => {
    cb(null, 1, 2, 3, 4);
  },
  (one,two,three,four,cb) => {
     // ...
  }
])

nie rób tego w powyższy sposób. Jest to znacznie lepszy wzorzec w użyciu:

async.waterfall([
  cb => {
    cb(null, {one:"one", two:"two"});
  },
  (v, cb) => {
    cb(null, [1, 2, 3, 4]);
  },
  (v,cb) => {
     // ...
  }
])

w ten sposób nie będziesz wyrywać włosów, próbując upewnić się, że argumenty funkcji mają odpowiednią długość. Pierwsza funkcja akceptuje tylko jeden argument - callback. Wszystkie pozostałe powinny przyjmować dwa argumenty - wartość i callback. Trzymaj się wzoru, a pozostaniesz przy zdrowych zmysłach!

Alexander Mills
źródło