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

时间:2015-09-02 02:08:00

标签: javascript asynchronous async.js

我正在尝试使用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()内部的异步操作是数据库查询。

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

谢谢!

1 个答案:

答案 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()发回给写作者并告诉他他做错了。