我对异步函数还很陌生,曾尝试过以下场景:
场景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将隐藏其错误消息,但在上面的示例中显然没有这样做
你必须向我们展示你读到这篇文章的背景,因为这本身就不正确。一个被拒绝的承诺,如果这种拒绝从未被发现,就会引起警告。
如果await
是p2
的promise,则await
与async
函数返回的promise绑定,并且该promise将正常工作。因此,这将起作用:
async function foo() {
const p2 = new Promise((_,reject) => reject('2'));
await p2;
}
foo().catch(() => {})
await
将被拒绝。这将导致async
函数返回的promise被拒绝,调用者将看到该拒绝,.catch()
将捕获它。如果没有await
,这只是一个孤立的promise。async
函数并不连接到它们内部的所有拒绝——它们只连接到等待或直接返回的拒绝。