繁体   English   中英

函数在等待完成之前返回

[英]Function returns before await finishes executing

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

似乎该函数在await返回已解决的Promise之前返回。

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

    return myEntityJSONConst;
}

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

我究竟做错了什么?

谢谢大家。

您在调用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()));

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

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

async函数中awaited的诺言解析后,该函数将继续执行。 如果遇到另一个await ,它将再次暂停执行。 无论最终从函数代码中返回的值是什么,都将用信号通知要返回的原始承诺,并使用该值对其进行解析,然后调用者可以通过自己的await或返回的诺言上的.then()来访问该值。

因此,假设dbQueryPromise(); 实际上没有返回与它应有的价值解决的承诺,那么你只需要使用任何await.then()从调用的返回值returnAfterReading()

const returnAfterReading = async () => {
    let myEntityJSONConst = {
        myEntity : {}
    }
    myEntityJSONConst.myEntity = await dbQueryPromise();

    return myEntityJSONConst;
}

returnAfterReading().then(val => {
     console.log(val);
}).catch(err => {
     console.log(err);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM