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