我正在尝试使用async.js库来实现以下目的:
a()
和功能b()
a()
首先执行直到完成,然后我希望函数b()
执行直到完成a()
调用其中的另一个异步函数到目前为止,我已经收集到了我应该使用异步库中的series()
函数。这就是我到目前为止所做的:
async.series([
function(callback) {
var someResult = a();
callback(null, someResult);
},
function(callback) {
var someOtherResult = b();
callback(null, someOtherResult);
}
],
function(err, results) {
console.log('Yay');
});
这与async.js文档中概述的代码非常相似,但在a()
内部还有其他一些异步活动正在进行。
我想等到a()
内的所有活动都完成后再执行b()
。这可能吗?如果我需要修改a()
的内容,需要做什么?我知道这类问题违背了应该如何在节点(以及一般的js)中编写内容,但a()
内部的异步操作是数据库查询。
如果需要,很乐意提供更多信息!
谢谢!
答案 0 :(得分:1)
所有异步函数都必须接受回调(或返回一个promise)。否则,在异步功能完成后无法执行某些操作。
所以,因为a()
是异步的。我假设你的例子:
var someResult = a();
是一个错字。它应该是:
a(function(someResult){
// ...
})
没有办法解决这个问题。您无法暂停解释器并等待异步函数完成,因为暂停解释器也会暂停事件循环,导致异步函数永远不会完成。
如果a()
写得正确,您应该可以这样做:
async.series([
function(callback) {
a(function(someResult){
callback(null, someResult);
});
},
function(callback) {
var someOtherResult = b();
callback(null, someOtherResult);
}
],
function(err, results) {
console.log('Yay');
});
如果没有,请将a()
发回给写作者并告诉他他做错了。