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

标签 javascript asynchronous promise

我无法理解 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/

相关文章:

node.js - 在 nodejs 上循环 redis 返回的 promise

javascript - 无法使用 promise 在数组中生成 "capture"Firebase 快照

javascript - 对预检请求的响应未通过 NodeJS 中的访问控制检查

asp.net-ajax - AJAX - 如何将值传递回服务器

javascript - 使用nodejs在异步函数中使用await和async的语法是什么?

ruby - 可延迟与回调接口(interface)

JavaScript:Selenium 在我输入密码之前偶尔会单击登录按钮

javascript - 如何使用javascript在每次点击时向html内容添加1

javascript - 带有 .hide() 函数的 Jquery 代码在 Django 模板中不起作用

javascript - ES6 模块 : re-export as object