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 ?
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 ?
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.
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.
@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.
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
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.
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
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 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.