PromiseRejectionEvent是如何触发的?

2023-11-21

我对以下问题感到困惑:

defined onunhandledrejection

window.onunhandledrejection = event =>{
  event.preventDefault();
  console.log('catch unhandlerejection', event)
}

和两个测试功能

function test1() {
    const rejectedP = Promise.reject('-');
    rejectedP.finally();
    return rejectedP;
}

async function test2() {
    const rejectedP = Promise.reject('-');
    rejectedP.finally();
    return rejectedP;
}

当我打电话时test1,只抓到一只onunhandledrejection,但是当我打电话时test2,我抓到了两个。

有什么区别test1 and test2?


test2被标记async确实将您的返回值包装在新的承诺中:

function test2() { // de-async-ified
    return new Promise(resolve => {
        const rejectedP = Promise.reject('-');
        rejectedP.finally();
        resolve(rejectedP);
    });
}

如果我们确实比较通话

const result1 = test1();
const result2 = test2();

通过将它们扩展到

const rejectedP = Promise.reject('-');
const finallyP = rejectedP.finally();
const result1 = rejectedP;

const result2 = new Promise(resolve => {
    const rejectedP = Promise.reject('-');
    const finallyP = rejectedP.finally();
    resolve(rejectedP);
});

我们可以看到第一个片段创建了两个承诺(result1 and rejectedP是相同的),而第二个片段创建了三个承诺。所有这些承诺都被拒绝了,但rejectedP拒绝是由附加到它的回调处理的,都通过….finally() and resolve(…)(这在内部做了….then(resolve, reject)).

finallyP是在两个示例中均未处理其拒绝的承诺。在第二个例子中,result2是一个不同于rejectedP这也没有被处理,导致第二个事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PromiseRejectionEvent是如何触发的? 的相关文章