不带"await"关键字的异步函数返回"Uncaught (in promise) error"



我对异步函数还很陌生,曾尝试过以下场景:

场景A

async function foo() {
const p2 = new Promise((_,reject) =>  reject('2')); //Uncaught (in promise) 2
}
foo().catch(() => {})

场景B

async function foo() {}
foo().catch(() => {})

我的问题是为什么错误消息会出现在场景A中?两种场景都隐含地返回具有值"0"的已解析承诺;未定义;但在场景A中只显示了错误消息。我还读到,没有指定.catch((的promise将隐藏其错误消息,但在上面的示例中显然没有这样做。我已经被困一个多小时了,非常感谢您的帮助!

您没有从函数返回p2承诺,因此,调用者无法将该承诺的结果catch()返回。而且,在这个特定的例子中,您的函数没有理由是async,因为您没有使用await,也没有抛出并期望它变成一个被拒绝的承诺。所以,你未兑现的承诺与这里的async没有任何关系。

async function foo() {
const p2 = new Promise((_,reject) =>  reject('2'));
return p2;
}
foo().catch(() => {})

或者删除不必要的async关键字:

function foo() {
const p2 = new Promise((_,reject) =>  reject('2'));
return p2;
}
foo().catch(() => {})

我的问题是,为什么在场景A中会出现错误消息?两种场景都隐含地返回具有值"0"的已解析承诺;未定义;但只有错误消息显示在场景A上。

因为您创建了一个promisep2,但对它什么都不做。它根本没有连接到foo()的返回值,也没有连接到从async函数foo自动返回的promise。它只是孤立在那里,因此没有人发现它的错误。

我还读到,没有指定.catch((的promise将隐藏其错误消息,但在上面的示例中显然没有这样做

你必须向我们展示你读到这篇文章的背景,因为这本身就不正确。一个被拒绝的承诺,如果这种拒绝从未被发现,就会引起警告。


如果awaitp2的promise,则awaitasync函数返回的promise绑定,并且该promise将正常工作。因此,这将起作用:

async function foo() {
const p2 = new Promise((_,reject) =>  reject('2'));
await p2;
}
foo().catch(() => {})

await将被拒绝。这将导致async函数返回的promise被拒绝,调用者将看到该拒绝,.catch()将捕获它。如果没有await,这只是一个孤立的promise。async函数并不连接到它们内部的所有拒绝——它们只连接到等待或直接返回的拒绝。

最新更新