我有下面的代码,我希望首先在我的控制台中有
hi
,然后是error
,最后是why
,但结果是:hi
,然后是why
,最后一个是 error
,所以我想知道,为什么会发生这种情况?
代码:
const test = new Promise((resolve, reject) => {
console.log("hi");
throw new Error("error");
})
test.finally(() => {
console.log("why")
})
我希望首先在控制台中出现
,然后出现错误,最后出现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
构造函数处理并转换为承诺拒绝(稍后,未处理)。
所以顺序是:
hi
finally
处理程序