我无法理解 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
的次数实际上被调用了……我迷路了……
最佳答案
哇,这真的很酷。我以前从未见过控制台这样做。 (不过,它有 other forms 的动态行为,所以......)这是发生了什么:
在第一种情况下,您的 setTimeout
之外的所有内容的代码执行回调的代码完成并且执行堆栈返回,因此只有“platform code”(正如 Promises/A+ 规范所称)正在运行,而不是用户态 JavaScript 代码(目前)。此时,promise 被拒绝,并且没有任何处理拒绝,所以这是一个未处理的拒绝,devtools 将它报告给你。
那么 ,五秒钟后,您的回调运行并附加一个拒绝处理程序。此时,拒绝不再未处理。显然,Chrome/V8/devtools 一起工作到 删除 来自控制台的未处理拒绝警告。相反,您看到的是您在拒绝处理程序中通过 console.log
输出的内容。 .如果您更早地附加拒绝处理程序,您将不会收到未处理的拒绝错误。
履行不会发生这种情况,因为不处理履行不是错误条件。不处理拒绝是。
关于javascript - 有了 Promise,为什么浏览器会返回两次拒绝而不是两次解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288256/