我在理解 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
. 如果您早点附加拒绝处理程序,您就不会得到未处理的拒绝错误。
这不会发生在履行中,因为不处理履行不是错误条件。不处理拒绝是。
添加回答
举报
0/150
提交
取消