Qual è la differenza tra async.waterfall e async.series


Risposte:


168

Sembra che async.waterfallconsenta a ciascuna funzione di passare i propri risultati alla funzione successiva, mentre async.seriespassa tutti i risultati al callback finale. A un livello più alto, async.waterfallsarebbe per una pipeline di dati ("dato 2, moltiplicalo per 3, aggiungi 2 e dividi per 17"), mentre async.seriessarebbe per attività discrete che devono essere eseguite in ordine, ma sono altrimenti separate.


È possibile che una di queste due funzioni restituisca un valore? Ho letto che è possibile, ma non riesco a trovare informazioni rilevanti da nessuna parte nella documentazione.
Anderson Green,

1
@ AndersonGreen: No. Guardando l'origine della libreria, né waterfallseriesrestituisce un valore. È previsto che qualunque sia il risultato verrà utilizzato nel parametro callback facoltativo.
Twisol

La risposta di cui sopra potrebbe essere corretta fino al 2012, ma quella corretta è la stessa della successiva, che è: series () come si chiama che TUTTI i risultati come una serie passata al callback finale e la cascata è l'ULTIMO risultato passato a la richiamata finale. Vedi Mozilla Developer
Jeb50

53

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.


1
Questa dovrebbe essere la risposta ;-)
Stuart Allen

@Mario "Entrambe le funzioni passano il callback della funzione precedente" OPPURE "Entrambe le funzioni passano il risultato della funzione precedente"?
user1451111

@ user1451111, Result, lol ... Sono sicuro di averlo scritto la prima volta però ...

26

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


1
Immagini incredibilmente create. Li hai creati tu stesso o li hai presi da qualche altra parte?
user1451111

dovresti inserire le immagini nella risposta, probabilmente alla gente mancheranno o / w
Alexander Mills

1

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.