为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Promise,为什么浏览器会返回拒绝两次而不是解决两次?

使用 Promise,为什么浏览器会返回拒绝两次而不是解决两次?

qq_遁去的一_1 2021-11-12 18:20:10
我在理解 javaScript 时遇到问题promises。我写了以下代码:var p = new Promise(function(resolve,reject){    reject(Error("hello world"));});setTimeout(()=>p.catch(e=>console.log(e)),5000);我立即在 Chrome 开发者控制台中看到了这一点:但是在我等待 5 秒钟后,消息会自动变为黑色,如下图所示:我以前从未在我的 javaScript 代码和开发人员控制台之间看到过这种行为,我的 javaScript 代码可以在开发人员控制台中“修改现有内容”。所以我决定resolve通过编写以下代码来看看是否会发生同样的情况:var p = new Promise(function(resolve,reject){    resolve("hello world");});setTimeout(()=>p.then(e=>console.log(e)),5000);但是在这种情况下,我的开发人员控制台直到 5 秒后才显示任何内容,然后将hello world.为什么resolve和reject被调用的时间如此不同?额外的我也写了这段代码:var p = new Promise(function(resolve,reject){    reject(Error("hello world"));});setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);setTimeout(()=>p.catch(null),7000);这会导致多个输出到开发人员控制台。在时间 0 时出现红色错误,在 5 秒时红色变为黑色并带有文本errors hello world,然后在 6 秒时出现新的错误消息errors 2 hello world,然后在 7 秒时出现红色错误消息。现在我对reject实际调用了多少次感到非常困惑......我迷路了......
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

哇,这真的很酷。我以前从未见过控制台这样做。(不过,它还有其他形式的动态行为,所以......)这是发生了什么:

在第一种情况下,setTimeout回调代码之外的所有代码执行完成,执行堆栈返回,因此只有“平台代码”(如 Promises/A+ 规范所称)正在运行,而不是用户级 JavaScript 代码(目前)。此时,promise 被拒绝并且没有任何东西处理拒绝,所以这是一个未处理的拒绝,devtools 将它报告给你。

然后,五秒钟后,您的回调运行并附加一个拒绝处理程序。此时,拒绝不再是未处理的。显然,Chrome/V8/devtools 协同工作以从控制台删除未处理的拒绝警告。相反,您看到的是您在拒绝处理程序中通过console.log. 如果您早点附加拒绝处理程序,您就不会得到未处理的拒绝错误。

这不会发生在履行中,因为不处理履行不是错误条件。不处理拒绝是。


查看完整回答
反对 回复 2021-11-12
  • 1 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信