我正在尝试await
以便在返回函数之前完成数据库查询,但是由于某种原因,我的方法似乎无法正常工作。
函数似乎在await
返回解析的Promise
之前返回。
var returnAfterReading = async () => {
let myEntityJSONConst = {
myEntity : {}
}
myEntityJSONConst["myEntity"] = await dbQueryPromise();
return myEntityJSONConst;
}
console.log(JSON.stringify(returnAfterReading())) // {"myEntity":{}}
我在做什么错?
谢谢大家。
答案 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()