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

我在理解 javaScript 时遇到问题promises。我写了以下代码:


var p = new Promise(function(resolve,reject){


    reject(Error("hello world"));

});


setTimeout(()=>p.catch(e=>console.log(e)),5000);

我立即在 Chrome 开发者控制台中看到了这一点:

http://img.mukewang.com/618e3ff20001aa7d05150103.jpg

但是在我等待 5 秒钟后,消息会自动变为黑色,如下图所示:

http://img4.mukewang.com/618e40010001e42204130169.jpg

我以前从未在我的 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实际调用了多少次感到非常困惑......我迷路了......


qq_遁去的一_1
浏览 205回答 1
1回答

慕虎7371278

哇,这真的很酷。我以前从未见过控制台这样做。(不过,它还有其他形式的动态行为,所以......)这是发生了什么:在第一种情况下,setTimeout回调代码之外的所有代码执行完成,执行堆栈返回,因此只有“平台代码”(如 Promises/A+ 规范所称)正在运行,而不是用户级 JavaScript 代码(目前)。此时,promise 被拒绝并且没有任何东西处理拒绝,所以这是一个未处理的拒绝,devtools 将它报告给你。然后,五秒钟后,您的回调运行并附加一个拒绝处理程序。此时,拒绝不再是未处理的。显然,Chrome/V8/devtools 协同工作以从控制台删除未处理的拒绝警告。相反,您看到的是您在拒绝处理程序中通过console.log. 如果您早点附加拒绝处理程序,您就不会得到未处理的拒绝错误。这不会发生在履行中,因为不处理履行不是错误条件。不处理拒绝是。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript