我有下面的代码,我希望在我的控制台中首先有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

你会得到if个你处理拒绝promise ,像这样:

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

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

...但是你的代码并没有处理拒绝,所以直到环境中未处理的拒绝代码启动,直到所有显式处理promise的代码都执行完之后,才会报告拒绝.

正如你在注释中所说的,new Promise和你传递给它的函数的执行都是同步的,但是在该函数中抛出的错误并不是未处理的,而是由Promise构造函数处理并转换为promise拒绝(later,未处理).

所以顺序是:

  1. 创建一个promise
  2. 输出hi
  3. 用错误来否定诺言
  4. 在上面附加一个finally的处理器
  5. Run any appropriate handlers attached to the promise (since it's settled), in this case your finally handler
    1. 输出why
    2. finally人创造的promise
  6. 确定拒绝未处理并报告

Javascript相关问答推荐

Angular material 表多个标题行映射

在卡信息之间切换

如何使用React渲染器放置根dis?

如何按预期聚合SON数据?

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

如何分配类型脚本中具有不同/额外参数的函数类型

Next.js(react)使用moment或不使用日期和时间格式

如何在ASP.NET JavaScript中使用Google Charts API仅对绘制为负方向的条形图移动堆叠条形图标签位置

在运行时使用Next JS App Router在服务器组件中运行自定义函数

提交链接到AJAX数据结果的表单

Reaction Redux&Quot;在派单错误中检测到状态Mutations

面对代码中的错误作为前端与后端的集成

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

每次重新呈现时调用useState initialValue函数

如果NetSuite中为空,则限制筛选

如果对象中的字段等于某个值,则从数组列表中删除对象

在HTML5画布上下文中使用putImageData时,重载解析失败

如何在移动设备中使用JAVASSCRIPT移除点击时的焦点/悬停状态

如何将对象推送到firestore数组?

需要从对象生成列表