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

时间:2012-02-13 10:03:37

标签: javascript node.js asynchronous node-async

nodejs async模块:https://github.com/caolan/async提供了两种类似的方法,async.waterfallasync.series

他们之间有什么区别?

4 个答案:

答案 0 :(得分:158)

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

答案 1 :(得分:50)

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

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

答案 2 :(得分:25)

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

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

的操作

答案 3 :(得分:2)

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

我强烈建议async.waterfall([ cb => { cb(null, {one:"one", two:"two"}); }, (v, cb) => { cb(null, [1, 2, 3, 4]); }, (v,cb) => { // ... } ]) 作为async.waterfall的替代方案。 https://caolan.github.io/async/autoInject.js.html

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

警告:这是错误的模式

{{1}}

请勿以上述方式进行操作。这是一种更好用的模式

{{1}}

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