O módulo async nodejs: https://github.com/caolan/async fornece 2 métodos semelhantes, async.waterfall
e async.series
.
Qual a diferença entre eles?
O módulo async nodejs: https://github.com/caolan/async fornece 2 métodos semelhantes, async.waterfall
e async.series
.
Qual a diferença entre eles?
Respostas:
Parece que async.waterfall
permite que cada função passe seus resultados para a próxima função, enquanto async.series
passa todos os resultados para o retorno de chamada final. Em um nível mais alto, async.waterfall
seria para um pipeline de dados ("dado 2, multiplique por 3, some 2 e divida por 17"), enquanto async.series
seria para tarefas discretas que devem ser realizadas em ordem, mas de outra forma são separadas.
waterfall
nem series
retorna um valor. Espera-se que qualquer que seja o resultado será usado no parâmetro de retorno de chamada opcional.
Ambas as funções passam o valor de retorno, de cada função, para a próxima, então quando feito irá chamar o callback principal, passando seu erro, caso ocorra um erro.
A diferença é que async.series()
, uma vez terminada a série, passará todos os resultados para o callback principal. async.waterfall()
irá passar para o callback principal apenas o resultado da última função chamada.
async.waterfall()
está lidando com um action that relies on the previous outcome
.
async.series()
é lidar com uma ação que deseja see all the result at the end
Considero async.waterfall prejudicial, porque é difícil refatorar uma vez escrito e também sujeito a erros, pois se você fornecer mais argumentos, outras funções alteram muito a assinatura.
Eu recomendo altamente async.autoInject
como uma ótima alternativa, async.waterfall.
https://caolan.github.io/async/autoInject.js.html
Se você optar por usar async.waterfall, recomendo armazenar tudo em um objeto, para que suas funções não precisem alterar o comprimento / assinaturas, assim:
aviso: este é um padrão ruim
async.waterfall([
cb => {
cb(null, "one", "two");
},
(one, two, cb) => {
cb(null, 1, 2, 3, 4);
},
(one,two,three,four,cb) => {
// ...
}
])
não faça da maneira acima. Este é um padrão muito melhor de usar:
async.waterfall([
cb => {
cb(null, {one:"one", two:"two"});
},
(v, cb) => {
cb(null, [1, 2, 3, 4]);
},
(v,cb) => {
// ...
}
])
assim, você não vai puxar o cabelo tentando ter certeza de que os argumentos da função têm o comprimento correto. A primeira função aceita apenas um arg - callback. Todos os restantes devem aceitar dois argumentos - um valor e um retorno de chamada. Siga o padrão e você permanecerá são!