【发布时间】:2015-11-20 22:49:50
【问题描述】:
我是否最好避免一次使用多个异步模块功能实例?
我的代码分三部分依次执行。我正在使用类似的代码
var async = require('async');
async.waterfall(
[ function(cb) { part1(); },
function(cb) { part2(); },
function(cb) { part3(); }
],
function(err, res) { console.log('Done'); }
);
part1() 也包含三个部分。其中第三个在前两个之后运行。我的想法是使用
function part1(err, res) {
async.waterfall(
[ function(cb) {
async.parallel(
[ function(cb) { part1a(); },
function(cb) { part1b(); }
]
);
},
function(cb) { part1c(); },
function(cb) {
if (err) return err('part 1 error')
return res()
}
]
);
}
在 part1a 和 part1b 运行的地方,我使用了异步的三个特性:外部瀑布,以及 part1 中的瀑布和并行。我对 part1 进行了重组,只使用了一个功能:瀑布,part1a 然后 part1b 然后 part1c 只是为了让它工作。
我没有取得成功。例如,我没有看到“完成”消息。当我重组 part1 时,我接到了 part1a 的电话,但没有接到 part1b 或其他任何电话。
也许我并不孤单。在Optional callback not being called in the node.js async module's forEachOf method 中,@LuisDelgado 指出,“作为个人说明,到目前为止,我还没有成功地使异步与本身具有内部回调异步函数的函数很好地工作。”
在 Complicated use case for Node.js Async Module 中,@Robbie 和 @dark_shadow 发现 async.auto 取得了一些成功。我想这将涉及通过将我的三个外层函数分解为它们的组件并从外层调用每个组件来扁平化我的代码。也许这就是“JavaScript 方式”!
什么是对的?
提前致谢...
编辑:干得好,亚当萨克斯。非常感谢!后续...
编辑:亚当和其他人提出了承诺。 Adam 喜欢 bluebird,并展示了一些有用的语法。我遇到了蓝鸟问题,尽管它很吸引人。我在这里发布了一个后续的蓝鸟问题。通过此编辑,我将删除该后续问题,将此问题(如标题所示)保留为异步问题。
感谢那些鼓励我使用承诺的人,谢谢!请参阅node.js, bluebird, poor control of execution path。
仍然存在异步问题:我是否最好避免一次使用多个异步模块功能实例?
【问题讨论】:
-
您需要在瀑布/并行函数各自的操作完成后调用回调
cb传递给它们 -
使用 Promise 可以说更容易(也更易读)。 @ExplosionPills 如果您的句柄是对 Star Ocean 2 的引用,那么您刚刚成为我最喜欢的 SO 用户。
-
@ExplosionPills:谢谢。每个“我的”函数(“part1()”和 part1x())都有一个被调用的回调。如果你告诉我我应该调用我为异步(“cb”)添加的回调,那里有对我来说很有价值的信息。我在哪里称呼它们?
-
@BaldEagle,只要函数的异步部分完成,您就会调用它们,就像您在不使用
async时调用回调一样。
标签: javascript node.js asynchronous async.js