没有“await”关键字的异步函数返回“未捕获(承诺)错误”

时间:2021-05-09 17:40:45

标签: javascript asynchronous promise

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

场景 A

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

场景 B

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

我的问题是为什么会在场景 A 中出现错误消息?这两种情况都隐含地返回了一个值为“undefined”的已解决承诺,但只有错误消息显示在方案 A 上。我还读到没有指定 .catch() 的承诺将隐藏其错误消息,但它显然没有这样做在上面的例子中。我被困了一个多小时,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您没有从函数中返回 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中会出现错误信息?两种情况都隐式地返回了一个值为“undefined”的已解决承诺,但在情况 A 中只显示错误消息。

因为您正在创建一个承诺 p2,然后什么都不做。它与 foo() 的返回值或从 async 函数 foo 自动返回的承诺完全无关。它只是自己孤立在那里,因此没有人发现它的错误。

<块引用>

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

你必须向我们展示你阅读它的上下文,因为它本身是不正确的。被拒绝的承诺永远不会被捕获,将导致警告。


如果您 await 您的 p2 承诺,那么 awaitasync 函数返回的承诺相关联,并且会正常工作。所以,这将起作用:

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

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

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