为什么 Promise 对于 js 中的错误有一个奇怪的优先级?

问题描述 投票:0回答:1

我有下面的代码,我希望首先在我的控制台中有

hi
,然后是
error
,最后是
why
,但结果是:
hi
,然后是
why
,最后一个是
 error
,所以我想知道,为什么会发生这种情况?

代码:

const test = new Promise((resolve, reject) => {
console.log("hi");
throw new Error("error");
})


test.finally(() => {
console.log("why")
})
javascript promise throw
1个回答
1
投票

我希望首先在控制台中出现

hi
,然后出现错误,最后出现
why

这就是你会得到的如果你正在处理承诺的拒绝,就像这样:

const test = new Promise((resolve, reject) => {
    console.log("hi");
    throw new Error("error");
});

test
.catch((error) => console.error(error))
.finally(() => {
    console.log("why")
});

...但是您的代码不处理拒绝,因此在环境中未处理的拒绝代码启动之前不会报告拒绝,直到所有显式处理承诺的代码都已执行之后。

正如您在评论中所说,

new Promise
和您传递给它的函数的执行都是同步的,但是该函数中抛出的错误不是未处理的,它由
Promise
构造函数处理并转换为承诺拒绝(稍后,未处理)。

所以顺序是:

  1. 做出承诺
  2. 输出
    hi
  3. 拒绝错误的承诺
  4. 为其附加一个
    finally
    处理程序
  5. 运行附加到承诺的任何处理程序
  6. 确定拒绝未处理并报告
© www.soinside.com 2019 - 2024. All rights reserved.