Quelle est la différence entre async.waterfall et async.series

Réponses:

168

Il semble que cela async.waterfallpermet à chaque fonction de transmettre ses résultats à la fonction suivante, tout en async.seriestransmettant tous les résultats au rappel final. À un niveau supérieur, async.waterfallserait pour un pipeline de données ("étant donné 2, multipliez-le par 3, ajoutez 2 et divisez par 17"), alors que ce async.seriesserait pour des tâches discrètes qui doivent être exécutées dans l'ordre, mais qui sont par ailleurs séparées.

Twisol
la source
Est-il possible pour l'une de ces deux fonctions de renvoyer une valeur? J'ai lu que c'était possible, mais je ne trouve aucune information pertinente dans la documentation.
Anderson Green
1
@AndersonGreen: Non. En regardant la source de la bibliothèque, ni waterfallni ne seriesrenvoie une valeur. Il est prévu que quel que soit le résultat, il sera utilisé dans le paramètre de rappel facultatif.
Twisol
La réponse ci-dessus peut être correcte en 2012, mais la bonne est la même que la suivante, qui est: series () comme il est nommé que TOUS les résultats comme une série passée au rappel final, et waterfall est le DERNIER résultat passé à le rappel final. Voir Mozilla Developer
Jeb50
53

Les deux fonctions passent la valeur de retour de chaque fonction à la suivante, puis une fois terminé, elle appellera le rappel principal, en passant son erreur, si une erreur se produit.

La différence est que async.series(), une fois la série terminée, transmettra tous les résultats au callback principal. async.waterfall()transmettra au rappel principal uniquement le résultat de la dernière fonction appelée.


la source
1
Cela devrait être la réponse ;-)
Stuart Allen
@Mario "Les deux fonctions transmettent le rappel de la fonction précédente" OU "Les deux fonctions transmettent le résultat de la fonction précédente"?
user1451111
@ user1451111, Result, lol ... Je suis sûr que j'avais écrit que la première fois cependant ...
26

async.waterfall()traite d'un action that relies on the previous outcome.

async.series() traite d'une action qui veut see all the result at the end

Wayne Chiu
la source
1
Images génialement créées. Les avez-vous créés vous-même ou les avez-vous obtenus ailleurs?
user1451111
vous devriez mettre les images dans la réponse, les gens vont probablement les manquer o / w
Alexander Mills
1

Je considère async.waterfall comme nuisible, car il est difficile à refactoriser une fois écrit et également sujet aux erreurs car si vous fournissez plus d'arguments, d'autres fonctions changent beaucoup la signature.

Je recommande vivement async.autoInjectcomme alternative à async.waterfall. https://caolan.github.io/async/autoInject.js.html

Si vous choisissez d'utiliser async.waterfall, je vous recommande de tout stocker dans un seul objet, afin que vos fonctions n'aient pas à changer la longueur / les signatures, comme ceci:

avertissement: c'est un mauvais schéma

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

ne le faites pas de la manière ci-dessus. C'est un bien meilleur modèle à utiliser:

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

de cette façon, vous ne vous tirerez pas les cheveux en essayant de vous assurer que les arguments de la fonction ont la bonne longueur. La première fonction n'accepte qu'un seul argument - callback. Tous les autres doivent accepter deux arguments - une valeur et un rappel. Tenez-vous en au modèle et vous resterez sain d'esprit!

Alexander Mills
la source