我对异步函数还很陌生,并尝试了以下场景:
场景 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() 的承诺将隐藏其错误消息,但它显然没有这样做在上面的例子中。我被困了一个多小时,非常感谢任何帮助!
答案 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
承诺,那么 await
与 async
函数返回的承诺相关联,并且会正常工作。所以,这将起作用:
async function foo() {
const p2 = new Promise((_,reject) => reject('2'));
await p2;
}
foo().catch(() => {})
await
将看到拒绝。这将导致 async
函数返回拒绝的承诺,调用者将看到该拒绝,而您的 .catch()
将捕获它。如果没有 await
,这只是一个孤立的承诺。 async
函数不会连接到它们内部的所有拒绝 - 它们只连接到等待或直接返回的拒绝。