确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用

Ensure two functions execute one after the other, where the first function has an asynchronous call inside it

我正在尝试使用 async.js 库来实现以下目标:

到目前为止我已经收集到我应该使用异步库中的 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() 内部还有一些其他异步 activity 正在进行。

我想等到 a() 中的所有 activity 都完成后才执行 b()。这可能吗?如果我需要修改a()的内容,需要做什么?我知道这类问题违背了应该如何在节点(和一般的 js)中编写东西,但是 a() 内部进行的异步操作是数据库查询。

如果需要,很乐意提供更多信息!

谢谢!

所有异步函数都必须接受回调(或 return 承诺)。否则异步函数完成后无法执行某些操作。

所以,因为 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() 发回给写它的人并告诉他他做错了。