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

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

本文关键字:一个 函数 第一个 内部 有一个 异步 调用 两个 确保 执行      更新时间:2023-09-26

我正在尝试使用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()的内容,需要做什么?我知道这种问题违背了应该如何用node(和一般的js)编写的东西,但是a()内部的异步操作是一个数据库查询。

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

谢谢!

所有异步函数必须接受回调(或返回一个promise)。否则,在async函数完成后无法执行某些操作。

所以,因为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()发给写这篇文章的人,告诉他他做错了。