没有 return 语句的异步等待?

问题描述 投票:0回答:1

所以...我已经搜索了很长一段时间但从未找到明确的答案...没有 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...
}

但这感觉是错误的,因为它没有明确返回承诺......而且因为我正在代表......谁等待?但我实际上想不出有什么问题......

有人想说“是的,这完全合法”或“不不不,这是代码臭味,你永远不应该这样做”?

提前感谢:互联网

typescript asynchronous async-await return
1个回答
0
投票

所有

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 中的函数,如果它没有显式返回任何值。

© www.soinside.com 2019 - 2024. All rights reserved.