Moduł async nodejs: https://github.com/caolan/async udostępnia 2 podobne metody, async.waterfalla async.series.
Jaka jest różnica między nimi?
Moduł async nodejs: https://github.com/caolan/async udostępnia 2 podobne metody, async.waterfalla async.series.
Jaka jest różnica między nimi?
Odpowiedzi:
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.
waterfallani nie serieszwraca wartości. Oczekuje się, że niezależnie od wyniku zostanie użyty w opcjonalnym parametrze wywołania zwrotnego.
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.
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
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!