函数在等待完成之前返回

时间:2019-08-08 07:27:44

标签: javascript node.js async-await

我正在尝试await以便在返回函数之前完成数据库查询,但是由于某种原因,我的方法似乎无法正常工作。

函数似乎在await返回解析的Promise之前返回。

var returnAfterReading = async () => {
    let myEntityJSONConst = {
        myEntity : {}
    }
    myEntityJSONConst["myEntity"] = await dbQueryPromise();

    return myEntityJSONConst;
}

console.log(JSON.stringify(returnAfterReading())) // {"myEntity":{}}  

我在做什么错?

谢谢大家。

2 个答案:

答案 0 :(得分:1)

在调用returnAfterReading()函数之前,您缺少等待:

  

请注意,returnAfterReading()函数应在async上下文中(在async函数中调用),否则您需要使用promise(例如returnAfterReading().then(data => { /* bla-bla */ })

const returnAfterReading = async () => {
    const myEntityJSONConst = {
        myEntity : {}
    }
    myEntityJSONConst["myEntity"] = await dbQueryPromise();

    return myEntityJSONConst;
}

// ... In some other async context
console.log(JSON.stringify(await returnAfterReading()));

答案 1 :(得分:1)

  

函数似乎在等待返回已解决的Promise之前返回。

是的,这正是async函数的工作方式。当执行async函数时,当它碰到等待承诺的await时,它立即从async函数返回。而且,返回值是尚未解决的承诺。因此,所有async函数都会返回一个承诺。函数的调用者将很快获得一个诺言(尚未解决)。调用方将需要在该承诺上使用await(如果在更高级别的async函数中)或.then()来获得最终的解析值。

一旦awaited函数内部的async的诺言得以解决,该函数将继续执行。如果它碰到另一个await,它将再次暂停执行。无论最终从函数代码返回的值是什么,它都将用信号返回已被解决的原始承诺,然后调用者可以通过自己的await.then()访问该值。返回的承诺。

因此,假设dbQueryPromise();确实返回了以正确值解决的承诺,那么您只需在调用{的返回值上使用await.then() {1}}

returnAfterReading()