Node在继续之前等待异步函数执行完成

40

我有一个使用异步函数的节点应用程序。

在继续进行应用程序流程之前,我该如何等待异步函数完成?

下面是一个简单的例子。

var a = 0;
var b = 1;
a = a + b;

// this async function requires at least 30 sec
myAsyncFunction({}, function(data, err) {
    a = 5;
});

// TODO wait for async function

console.log(a); // it must be 5 and not 1
return a;
在这个例子中,必须返回元素"a"的值为5而不是1。仅当应用程序等待异步函数时,才会返回值为1。
谢谢

4
太棒了,非常有用的评论。 - user2520969
3
是的,正如您在标签中建议的那样,承诺和“async”/“await”语法糖是解决问题的途径。您是否尝试将它们应用于您的问题?请展示一下您所做的努力。 - Bergi
可能是重复的问题:如何从异步调用中返回响应? - Kevin B
1个回答

64

使用回调机制:

function operation(callback) {

    var a = 0;
    var b = 1;
    a = a + b;
    a = 5;

    // may be a heavy db call or http request?
    // do not return any data, use callback mechanism
    callback(a)
}

operation(function(a /* a is passed using callback */) {
    console.log(a); // a is 5
})

使用async/await

async function operation() {
    return new Promise(function(resolve, reject) {
        var a = 0;
        var b = 1;
        a = a + b;
        a = 5;

        // may be a heavy db call or http request?
        resolve(a) // successfully fill promise
    })
}

async function app() {
    var a = await operation() // a is 5
}

app()

3
我一直在寻找一个好的Promise解释,终于找到了!谢谢! - Porco
17
两种选择都实际上不会等待。特别地,await 返回的 a 并不是 5,而是一个 promise,它只是另一种需要回调的方式。正确的答案应该是:你无法等待。 - ceving
2
操作函数不需要在其前面加上async,因为它没有使用await。这是多余的,因为async使函数返回一个promise,但operation()已经返回了一个promise。 - Logan Cundiff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接