gpt4 book ai didi

javascript - 有了 Promise,为什么浏览器会返回两次拒绝而不是两次解析?

转载 作者:行者123 更新时间:2023-12-03 10:10:36 24 4
gpt4 key购买 nike

我无法理解 JavaScript promises .我写了以下代码:

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

reject(Error("hello world"));
});

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

我立即在我的 Chrome 开发者控制台中看到了这一点:
enter image description here

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

我以前从未在我的 javaScript 代码和开发人员控制台之间看到这种行为,我的 javaScript 代码可以在开发人员控制台中“修改现有内容”。

所以我决定看看 resolve 是否会出现同样的情况。通过编写此代码:
var p = new Promise(function(resolve,reject){

resolve("hello world");
});

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

但在这种情况下,我的开发人员控制台直到 5 秒后才显示任何内容,然后打印到 hello world .

为什么是 resolvereject在调用它们时会受到如此不同的对待吗?

额外

我还写了这段代码:
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 的次数实际上被调用了……我迷路了……

最佳答案

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

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

那么 ,五秒钟后,您的回调运行并附加一个拒绝处理程序。此时,拒绝不再未处理。显然,Chrome/V8/devtools 一起工作到 删除 来自控制台的未处理拒绝警告。相反,您看到的是您在拒绝处理程序中通过 console.log 输出的内容。 .如果您更早地附加拒绝处理程序,您将不会收到未处理的拒绝错误。

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

关于javascript - 有了 Promise,为什么浏览器会返回两次拒绝而不是两次解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com