El módulo asíncrono de nodejs: https://github.com/caolan/async proporciona 2 métodos similares async.waterfall
y 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.waterfall
y async.series
.
¿Cuál es la diferencia entre ellos?
Respuestas:
Parece que async.waterfall
permite que cada función pase sus resultados a la siguiente función, mientras que async.series
pasa todos los resultados a la devolución de llamada final. En un nivel superior, async.waterfall
sería para una canalización de datos ("dado 2, multiplíquelo por 3, sume 2 y divida por 17"), mientras async.series
que sería para tareas discretas que deben realizarse en orden, pero que por lo demás están separadas.
waterfall
ni series
devuelve 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.autoInject
como 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!