所以...我已经搜索了很长一段时间但从未找到明确的答案...没有 return 语句的异步函数有什么错误或不理想的地方吗?
例如,这无法编译:
// abstract a function to update a database that could work across multiple databases
public async updateGenericDatabase(v: string): Promise<void>
{
// the database specific client returns a non-void value so this won't compile:
// (and return await used to be taboo but now it's preferred, lol...)
return await updateSpecificDAandReturnNonVoid(v); // won't compile...
}
所以,
public async updateGenericDatabase(v: string): Promise<void>
{
await updateSpecificDAandReturnNonVoid(v); // does compile, but...
}
但这感觉是错误的,因为它没有明确返回承诺......而且因为我正在代表......谁等待?但我实际上想不出有什么问题......
有人想说“是的,这完全合法”或“不不不,这是代码臭味,你永远不应该这样做”?
提前感谢:互联网
所有
async
函数都会返回一个 Promise。如果从 async
函数返回非 Promise 值,它会隐式包装在 async
函数返回的 Promise 中。
如果您从
async
函数返回一个 Promise,那么您有两个 Promise:异步函数 Promise(我们称其为 p1)和异步函数体内返回的 Promise(我们称其为 p2)。
在这种情况下,p1 Promise 将等待 p2 Promise 结算(履行/拒绝)。这称为 p1 Promise resolving 到 p2 Promise。这导致p1承诺等待p2承诺解决,并且在p2解决之后,p1将遇到与p2相同的命运,即,如果p2满足,p1就会满足。同样,如果 p2 被拒绝,p1 也会被拒绝。
在你的代码中,如果你想等待
updateSpecificDAandReturnNonVoid
返回的 Promise 结算,那么你需要在 return
函数中添加 async
语句。
不添加
return
语句将导致 async
函数承诺不等待内部承诺 (p2),并且 async
函数将满足 undefined
的值,因为这是从 a 隐式返回的值JavaScript 中的函数,如果它没有显式返回任何值。