nodejs异步模块:https : //github.com/caolan/async提供2 种类似的方法,async.waterfall
和async.series
。
它们之间有什么区别?
nodejs异步模块:https : //github.com/caolan/async提供2 种类似的方法,async.waterfall
和async.series
。
它们之间有什么区别?
Answers:
似乎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-回调。其余所有参数都应接受两个参数-值和回调。坚持该模式,您将保持理智!