为什么promise catch无法与wait一起工作?
我要在拒绝时捕获错误,但结果有两个差异
(async () => {
var t = (new Promise((r1, r2) => r2(12345)));
t.catch(e=> console.log(e));
await t;
})()
结果错误:VM5989:1 Uncaught (in promise)
(async () => {
var t = (new Promise((r1, r2) => r2(12345))).catch(e=> console.log(e));
await t;
})()
没有错误并返回12345
演示图片:
在node@12
/ chrome@75 console
处,我得到了两个差异结果。
当我使用t.catch
时,我得到了Unhandled promise rejection
。
使用(new Promise()).catch
时,我得到的结果除外。
为什么?以及如何使用t
并获得正确的结果?
答案 0 :(得分:2)
在第一个示例中,您通过调用t.catch()
创建了一个处理该异常的新诺言,但没有将其分配给t
,因此t
仍然是一个诺言,带有一个未处理的拒绝。
在第二个示例中,t
引用的链是一个带有已处理拒绝的承诺(.catch()
连续不会抛出,因此它以undefined
解析),所以等待{{ 1}}不会引发t
函数。
但是,由于第一个示例中的async
仍然包含被拒绝的承诺,因此等待它将会导致t
函数抛出。
答案 1 :(得分:-1)
在第一个代码中,您将捕获钩和promise链接的位置仅在链接之后开始。
//Single promise that starts after the chain
(async () => {
const t = (new Promise((r1, r2) => r2(12345))).catch(e=> console.log(e));
await t;
})()
在第二段代码中,您正在等待没有catch块的promise对象。
(async () => {
const t = (new Promise((r1, r2) => r2(12345))); // "A" promise
t.catch(e=> console.log(e)); // "A" promise + catch = "B" promise
await t; // You are awaiting for the "A" promise
})()
答案 2 :(得分:-2)
在第一种情况下,由于Promise
本质上是异步的,并且甚至在附加catch之前,语句r2已经执行。
这意味着在调用r2(拒绝函数)时不存在catch。
每当您在使用promise时拒绝时,必须存在catch。否则,很明显会看到拒绝错误。
编辑: @Patrick Roberts回答,
该错误不是由于未处理的捕获,而是由于rejected
t
的异常。在第二个语句中,t
(承诺)仍然是pending
。