Moduł async nodejs: https://github.com/caolan/async udostępnia 2 podobne metody, async.waterfall
a async.series
.
Jaka jest różnica między nimi?
Moduł async nodejs: https://github.com/caolan/async udostępnia 2 podobne metody, async.waterfall
a async.series
.
Jaka jest różnica między nimi?
Odpowiedzi:
Wydaje się, że async.waterfall
umożliwia każdej funkcji przekazanie wyników do następnej funkcji, podczas gdy async.series
wszystkie wyniki przekazuje do końcowego wywołania zwrotnego. Na wyższym poziomie async.waterfall
byłoby to dla potoku danych („biorąc pod uwagę 2, pomnóż to przez 3, dodaj 2 i podziel przez 17”), podczas gdy async.series
byłoby to dla zadań dyskretnych, które muszą być wykonywane po kolei, ale poza tym są oddzielne.
waterfall
ani nie series
zwraca 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.autoInject
jako ś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!