PromiseRejectionEvent如何触发?

hui*_*hen 5 javascript promise

我对以下问题感到困惑?

定义的 onunhandledrejection

window.onunhandledrejection = event =>{
  event.preventDefault();
  console.log('catch unhandlerejection', event)
}
Run Code Online (Sandbox Code Playgroud)

和两个测试功能

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

async function test2() {
    const rejectedP = Promise.reject('-');
    rejectedP.finally();
    return rejectedP;
}
Run Code Online (Sandbox Code Playgroud)

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

test1和之间有什么区别test2

Ber*_*rgi 4

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

\n\n
function test2() { // de-async-ified\n    return new Promise(resolve => {\n        const rejectedP = Promise.reject('-');\n        rejectedP.finally();\n        resolve(rejectedP);\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我们确实比较通话

\n\n
const result1 = test1();\nconst result2 = test2();\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过将它们扩展到

\n\n
const rejectedP = Promise.reject('-');\nconst finallyP = rejectedP.finally();\nconst result1 = rejectedP;\n\nconst result2 = new Promise(resolve => {\n    const rejectedP = Promise.reject('-');\n    const finallyP = rejectedP.finally();\n    resolve(rejectedP);\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

finallyP是在两个示例中均未处理其拒绝的承诺。在第二个示例中,result2与此不同的 PromiserejectedP也未得到处理,从而导致第二个事件。

\n