Qual é a diferença entre async.waterfall e async.series

Respostas:

168

Parece que async.waterfallpermite que cada função passe seus resultados para a próxima função, enquanto async.seriespassa todos os resultados para o retorno de chamada final. Em um nível mais alto, async.waterfallseria para um pipeline de dados ("dado 2, multiplique por 3, some 2 e divida por 17"), enquanto async.seriesseria para tarefas discretas que devem ser realizadas em ordem, mas de outra forma são separadas.

Twisol
fonte
É possível que uma dessas duas funções retorne um valor? Eu li que é possível, mas não consigo encontrar informações relevantes em nenhuma parte da documentação.
Anderson Green
1
@AndersonGreen: Não. Olhando para a fonte da biblioteca, nem waterfallnem seriesretorna um valor. Espera-se que qualquer que seja o resultado será usado no parâmetro de retorno de chamada opcional.
Twisol
A resposta acima pode estar correta em 2012, mas a correta é a mesma que a próxima, que é: series () como é nomeado que TODOS os resultados como uma série passada para o retorno de chamada final, e a cascata é o ÚLTIMO resultado passado para o retorno de chamada final. Ver Mozilla Developer
Jeb50
53

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.


fonte
1
Esta deve ser a resposta ;-)
Stuart Allen
@Mario "Ambas as funções passam o retorno de chamada da função anterior" OU "Ambas as funções passam o resultado da função anterior"?
user1451111
@ user1451111, Resultado, lol ... Tenho certeza de que escrevi isso da primeira vez ...
26

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

Wayne Chiu
fonte
1
Imagens incrivelmente criadas. Você mesmo os criou ou os adquiriu em outro lugar?
user1451111
você deve colocar as fotos na resposta, as pessoas provavelmente sentirão falta delas
Alexander Mills
1

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

Alexander Mills
fonte