【发布时间】:2012-03-04 17:48:03
【问题描述】:
nodejs 异步模块:https://github.com/caolan/async 提供了 2 个类似的方法,async.waterfall 和 async.series。
它们有什么区别?
【问题讨论】:
标签: javascript node.js asynchronous node-async
nodejs 异步模块:https://github.com/caolan/async 提供了 2 个类似的方法,async.waterfall 和 async.series。
它们有什么区别?
【问题讨论】:
标签: javascript node.js asynchronous node-async
似乎async.waterfall 允许每个函数将其结果传递给下一个函数,而async.series 将所有结果传递给最终回调。在更高的层次上,async.waterfall 将用于数据管道(“给定 2,将其乘以 3,加 2,然后除以 17”),而 async.series 将用于必须按顺序执行的离散任务,但在其他方面是分开的。
【讨论】:
waterfall 和 series 都没有返回值。预计无论结果如何,都将在可选的回调参数中使用。
两个函数都将每个函数的返回值传递给下一个函数,然后在完成时调用主回调,如果发生错误,则传递其错误。
不同之处在于async.series(),一旦系列完成,会将所有结果传递给主回调。 async.waterfall() 只会将最后调用的函数的结果传递给主回调。
【讨论】:
async.waterfall() 正在处理 action that relies on the previous outcome。
async.series() 正在处理一个想要see all the result at the end 的操作
【讨论】:
我认为 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 - 回调。所有其余的都应该接受两个参数 - 一个值和回调。坚持这个模式,你就会保持清醒!
【讨论】: