Il modulo async nodejs: https://github.com/caolan/async fornisce 2 metodi simili async.waterfall
e async.series
.
Qual'è la differenza tra loro?
Il modulo async nodejs: https://github.com/caolan/async fornisce 2 metodi simili async.waterfall
e async.series
.
Qual'è la differenza tra loro?
Risposte:
Sembra che async.waterfall
consenta a ciascuna funzione di passare i propri risultati alla funzione successiva, mentre async.series
passa tutti i risultati al callback finale. A un livello più alto, async.waterfall
sarebbe per una pipeline di dati ("dato 2, moltiplicalo per 3, aggiungi 2 e dividi per 17"), mentre async.series
sarebbe per attività discrete che devono essere eseguite in ordine, ma sono altrimenti separate.
waterfall
né series
restituisce un valore. È previsto che qualunque sia il risultato verrà utilizzato nel parametro callback facoltativo.
Entrambe le funzioni passano il valore di ritorno di ogni funzione alla successiva, quindi una volta terminato chiamerà il callback principale, passandone l'errore, se si verifica un errore.
La differenza è che async.series()
, una volta terminata la serie, passerà tutti i risultati al callback principale. async.waterfall()
passerà al callback principale solo il risultato dell'ultima funzione chiamata.
async.waterfall()
ha a che fare con un file action that relies on the previous outcome
.
async.series()
ha a che fare con un'azione che vuole see all the result at the end
Considero async.waterfall dannoso, perché è difficile eseguire il refactoring una volta scritto e anche soggetto a errori poiché se fornisci più argomenti, altre funzioni cambiano molto la firma.
Consiglio vivamente async.autoInject
come ottima alternativa a async.waterfall.
https://caolan.github.io/async/autoInject.js.html
Se scegli di usare async.waterfall, ti consiglio di memorizzare tutto in un oggetto, così le tue funzioni non devono cambiare lunghezza / firme, in questo modo:
avvertimento: questo è un cattivo schema
async.waterfall([
cb => {
cb(null, "one", "two");
},
(one, two, cb) => {
cb(null, 1, 2, 3, 4);
},
(one,two,three,four,cb) => {
// ...
}
])
non farlo nel modo sopra. Questo è un modello molto migliore da usare:
async.waterfall([
cb => {
cb(null, {one:"one", two:"two"});
},
(v, cb) => {
cb(null, [1, 2, 3, 4]);
},
(v,cb) => {
// ...
}
])
in questo modo non ti tirerai fuori i capelli cercando di assicurarti che gli argomenti della funzione abbiano la lunghezza giusta. La prima funzione accetta solo un arg - callback. Tutti i rimanenti dovrebbero accettare due argomenti: un valore e un callback. Attenersi allo schema e rimarrai sano di mente!