118 votes

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

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

Quelle est la différence entre eux ?

173voto

Twisol Points 1061

Il semble que async.waterfall permet à chaque fonction de transmettre ses résultats à la fonction suivante, alors que async.series transmet tous les résultats au callback final. A un niveau plus élevé, async.waterfall serait pour un pipeline de données ("donné 2, multiplié par 3, ajouté 2, et divisé par 17"), alors que async.series serait pour des tâches distinctes qui doivent être exécutées dans l'ordre, mais qui sont par ailleurs séparées.

0 votes

Est-il possible que l'une de ces deux fonctions renvoie une valeur ? J'ai lu que c'était possible, mais je ne trouve aucune information pertinente dans la documentation.

1 votes

@AndersonGreen : Non. En regardant la source de la bibliothèque, aucun waterfall ni series renvoie une valeur. On s'attend à ce que le résultat, quel qu'il soit, soit utilisé dans le paramètre de rappel facultatif.

0 votes

La réponse ci-dessus peut être correcte jusqu'en 2012, mais la réponse correcte est la même que la suivante, qui est : series() car elle est nommée que TOUS les résultats comme une série passée au callback Final, et waterfall est le DERNIER résultat passé au callback Final. Voir Développeur Mozilla

53voto

Alec Points 1392

Les deux fonctions transmettent la valeur de retour de chaque fonction à la suivante, puis, une fois la fonction terminée, appellent le callback principal, en transmettant son erreur, si une erreur se produit.

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

1 votes

Cela devrait être la réponse ;-)

0 votes

@Mario "Les deux fonctions passent le callback de la fonction précédente" OU "Les deux fonctions passent le résultat de la fonction précédente" ?

0 votes

@user1451111, Résultat, lol... Je suis sûr que j'avais écrit cela la première fois pourtant...

27voto

Wayne Chiu Points 2459

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

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

2voto

Alex Mills Points 635

Je considère que async.waterfall est nuisible, parce qu'il est difficile de le remanier une fois qu'il est écrit et aussi parce qu'il est source d'erreurs, car si vous fournissez plus d'arguments, d'autres fonctions modifient beaucoup la signature.

Je recommande vivement 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 à changer de longueur/signature, comme ceci :

avertissement : c'est un mauvais modèle

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 façon ci-dessus. Ceci est un modèle bien meilleur à utiliser :

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

Ainsi, vous n'aurez pas à vous arracher 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. Toutes les autres fonctions devraient accepter deux arguments - une valeur et un callback. Respectez ce modèle et vous resterez sain d'esprit !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X