[英]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.