Le module async nodejs: https://github.com/caolan/async fournit 2 méthodes similaires, async.waterfall
et async.series
.
Quelle est la différence entre eux?
Le module async nodejs: https://github.com/caolan/async fournit 2 méthodes similaires, async.waterfall
et async.series
.
Quelle est la différence entre eux?
Réponses:
Il semble que cela async.waterfall
permet à chaque fonction de transmettre ses résultats à la fonction suivante, tout en async.series
transmettant 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"), alors que ce 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.
waterfall
ni ne series
renvoie une valeur. Il est prévu que quel que soit le résultat, il sera utilisé dans le paramètre de rappel facultatif.
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.
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
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.autoInject
comme 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!