El módulo asíncrono de nodejs: https://github.com/caolan/async proporciona 2 métodos similares async.waterfally async.series.
¿Cuál es la diferencia entre ellos?
El módulo asíncrono de nodejs: https://github.com/caolan/async proporciona 2 métodos similares async.waterfally async.series.
¿Cuál es la diferencia entre ellos?
Respuestas:
Parece que async.waterfallpermite que cada función pase sus resultados a la siguiente función, mientras que async.seriespasa todos los resultados a la devolución de llamada final. En un nivel superior, async.waterfallsería para una canalización de datos ("dado 2, multiplíquelo por 3, sume 2 y divida por 17"), mientras async.seriesque sería para tareas discretas que deben realizarse en orden, pero que por lo demás están separadas.
waterfallni seriesdevuelve un valor. Se espera que sea cual sea el resultado, se utilizará en el parámetro de devolución de llamada opcional.
Ambas funciones pasan el valor de retorno, de cada función a la siguiente, luego, cuando termine, llamará a la devolución de llamada principal, pasando su error, si ocurre un error.
La diferencia es que async.series(), una vez finalizada la serie, se pasarán todos los resultados al callback principal. async.waterfall()pasará a la devolución de llamada principal solo el resultado de la última función llamada.
async.waterfall()está tratando con un action that relies on the previous outcome.
async.series() se trata de una acción que quiere see all the result at the end
Considero que async.waterfall es dañino, porque es difícil de refactorizar una vez escrito y también es propenso a errores, ya que si proporciona más argumentos, otras funciones cambian mucho la firma.
Recomiendo encarecidamente async.autoInjectcomo una gran alternativa, async.waterfall.
https://caolan.github.io/async/autoInject.js.html
Si elige usar async.waterfall, le recomiendo almacenar todo en un objeto, para que sus funciones no tengan que cambiar la longitud / firmas, así:
advertencia: este es un mal patrón
async.waterfall([
cb => {
cb(null, "one", "two");
},
(one, two, cb) => {
cb(null, 1, 2, 3, 4);
},
(one,two,three,four,cb) => {
// ...
}
])
no lo hagas de la forma anterior. Este es un patrón mucho mejor para usar:
async.waterfall([
cb => {
cb(null, {one:"one", two:"two"});
},
(v, cb) => {
cb(null, [1, 2, 3, 4]);
},
(v,cb) => {
// ...
}
])
de esa manera no se arrancará los pelos tratando de asegurarse de que los argumentos de la función tengan la longitud correcta. La primera función solo acepta un argumento de devolución de llamada. Todos los restantes deben aceptar dos argumentos: un valor y una devolución de llamada. ¡Apégate al patrón y permanecerás cuerdo!