瀑布式和系列式之间的区别是什么

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

他们之间有什么区别?

33829 次浏览

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

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

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

正在处理一个 action that relies on the previous outcome

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

I consider async.waterfall to be harmful, because it's hard to refactor once written and also error-prone since if you supply more arguments, other functions much change the signature.

我强烈推荐 async.autoInject作为异步 c.waterfall 的一个很好的替代品。 Https://caolan.github.io/async/autoinject.js.html

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

警告: 这是个坏模式

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

don't do it the above way. This is 一个更好的模式 to use:

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

这样你就不会为了确保函数参数的长度正确而费尽心思了。第一个函数只接受一个 arg 回调。所有其余的参数都应该接受两个参数-值和回调。坚持这个模式,你就会保持理智!