118

nodejs 异步模块:https ://github.com/caolan/async提供了 2 个类似的方法,async.waterfallasync.series.

它们之间有什么区别?

4

4 回答 4

173

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

于 2012-02-13T10:13:10.080 回答
53

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

不同之处在于async.series(),一旦系列完成,会将所有结果传递给主回调。async.waterfall()只会将最后一个调用函数的结果传递给主回调。

于 2013-01-08T14:14:24.610 回答
26

async.waterfall()正在处理一个action that relies on the previous outcome.

async.series()正在处理一个想要see all the result at the end

于 2016-08-31T13:30:35.617 回答
2

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

我强烈推荐async.autoInject作为 async.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 - 回调。所有其余的都应该接受两个参数 - 一个值和回调。坚持模式,你会保持清醒!

于 2019-02-04T02:13:35.840 回答