Javascript PromisejectionEvent是如何触发的?
我对以下问题感到困惑: 已定义的Javascript PromisejectionEvent是如何触发的?,javascript,promise,Javascript,Promise,我对以下问题感到困惑: 已定义的onunhandledrejection window.onunhandledrejection = event =>{ event.preventDefault(); console.log('catch unhandlerejection', event) } 和两个测试函数 function test1() { const rejectedP = Promise.reject('-'); rejectedP.finally()
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
时,只捕获了一个onUnhandlerRejection
,但当我调用test2
时,捕获了两个
test1
和test2
之间有什么区别?由于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
和rejectedP
相同),而第二个代码段创建了三个承诺。所有这些承诺都被拒绝,但是拒绝的p
拒绝由附加到它的回调来处理,通过…finally()
和resolve(…)
(内部执行…然后(resolve,reject)
)
finallyP
是两个示例中都没有处理拒绝的承诺。在第二个示例中,result2
是一个承诺,与rejectedP
不同,它也没有被处理,导致了第二个事件。test2是async
函数。。最后()
希望您向它传递一个回调,否则调用它没有意义,所以不清楚你认为你在用rejectedP.finally()做什么
@tiendoung,你能更详细地解释一下返回承诺与async
函数有什么不同吗?async
函数总是返回承诺,而你明确返回了rejectedP
。为什么要麻烦使用async
而不使用wait
?基本上。谢谢您的回答。但是如何理解“被拒绝的P拒绝是由附加到它的回调处理的”@huitingChen承诺被拒绝的P
被标记为“已处理”,因为附加到它的处理程序回调(通过最终
和然后
)要么处理拒绝,要么至少将其传播到链中。因此,即使rejectedP
被拒绝,也不会为其触发unhandledrejection
事件-它不是未处理的。