Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PromisejectionEvent是如何触发的?_Javascript_Promise - Fatal编程技术网

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
事件-它不是未处理的。