async.waterfall和async.series有什么区别


Answers:


168

似乎async.waterfall允许每个函数将其结果传递给下一个函数,同时async.series将所有结果传递给最终的回调。在更高级别上,async.waterfall将用于数据管道(“给定2,将其乘以3,再加2,并除以17”),而async.series对于必须按顺序执行但又分开的离散任务。


这两个函数中的任何一个都可能返回值吗?我已经知道有可能,但是我无法在文档的任何地方找到相关信息。
安德森·格林

1
@AndersonGreen:不。查看库源,既不返回值,waterfall也不series返回值。可以预期,无论结果如何,都将在可选的回调参数中使用。
Twisol 2012年

上面的答案可能是正确的,可以追溯到2012年,但是正确的答案与下一个答案相同,即:series(),其名称是将ALL结果作为系列传递给Final回调,而Waterfall是传递给最后的回调。参见Mozilla Developer
Jeb50'9

53

这两个函数都将每个函数的返回值传递给下一个函数,然后在完成时将调用主回调,并在发生错误时传递其错误。

区别在于async.series(),一旦完成该系列,就将所有结果传递给主回调。async.waterfall()仅将最后一个调用函数的结果传递给主回调。


1
这应该是答案;-)
斯图尔特·艾伦

@Mario“两个函数都传递前一个函数的回调”还是“两个函数都传递前一个函数的结果”?
user1451111 '17

@ user1451111,结果,大声笑...我确定我是第一次写过……


1

我认为async.waterfall是有害的,因为一旦编写就很难重构,而且容易出错,因为如果您提供更多的参数,其他函数会大大改变签名。

我强烈建议您使用async.autoInjectasync.waterfall作为替代方案。 https://caolan.github.io/async/autoInject.js.html

如果确实选择使用async.waterfall,我建议将所有内容存储在一个对象中,这样您的函数就不必更改长度/签名,如下所示:

警告:这是一个错误的模式

async.waterfall([
  cb => {
    cb(null, "one", "two");
  },
  (one, two, cb) => {
    cb(null, 1, 2, 3, 4);
  },
  (one,two,three,four,cb) => {
     // ...
  }
])

不要以上述方式做到这一点。这是一个更好用的模式

async.waterfall([
  cb => {
    cb(null, {one:"one", two:"two"});
  },
  (v, cb) => {
    cb(null, [1, 2, 3, 4]);
  },
  (v,cb) => {
     // ...
  }
])

这样,您就不会花力气确保函数参数的长度正确。第一个函数仅接受一个arg-回调。其余所有参数都应接受两个参数-值和回调。坚持该模式,您将保持理智!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.