web-dev-qa-db-fra.com

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

Le module asynchrone nodejs: https://github.com/caolan/async fournit 2 méthodes similaires, async.waterfall et async.series.

Quelle est la différence entre eux?

109
Bruce Dou

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

162
Twisol

Les deux fonctions transmettent la valeur de retour de chaque fonction à la suivante, puis une fois terminé, le rappel principal sera transmis, 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 rappel principal. async.waterfall() ne transmettra au rappel principal que le résultat de la dernière fonction appelée.

51
Mario

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

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

27
Wayne Chiu

Je considère async.waterfall comme dangereux, car il est difficile de 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 fortement async.autoInject comme une excellente 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 à modifier 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 tirerez pas vos 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 - rappel. Tous les autres doivent accepter deux arguments - une valeur et un rappel. Restez fidèle au modèle et vous resterez sain d'esprit!

1
Alexander Mills