Javascript ES6 承诺支持“done”api 吗?

2024-05-17

例如

p = new Promise(function (resolve, reject) {
    throw 'err';
});

p.done();

在大多数 Promise Polyfill 库中,done 会抛出错误,并且当前执行将退出。

但如果我们使用p.then(),什么也不会发生。错误被承诺吞没了。如果我们使用p.catch,我们没有办法退出当前的执行。我想实现类似的目标:

try {
    // something
} catch (err) {
    if (check(err)) {
        throw err;
    }
}

No.

不仅会.done规范的未来版本可能不支持 - 这是不需要的。引用 Mariusz 链接到的线程:

Domenic:

它仍然容易出错:如果你犯了错误,甚至一次不遵守规则,你可能会永远消除错误。

马克·米勒(Mark Miller,承诺概念的先驱):

请注意,weak-refs(希望在 ES7 中)将为我们提供弥合这一差距所需的诊断工具之一。使用弱引用,如果在没有通知任何处理程序的情况下收集了被拒绝的承诺,我们可以安排这生成诊断。 Promise 实现必须将原因保留在 Promise 的执行器(事后GC处理程序)中,以便它在发现 Promise 被拒绝后具有诊断报告。

Yehuda Kats 谈 RSVP 的错误处理程序:

我们在 RSVP 中采用的方法是安装一个默认抛出的未处理的承诺监视器。

如果您知道将附加异步错误处理程序,则可以通过附加 noop 失败处理程序来选择特定的 Promise 退出此行为。我们可能会为此准备糖(.undone :p)

根据我们的经验,将负担从每个人身上转移到可能想要附加异步错误处理程序的人身上是合适的。

而且,从规范之前的实际存储库来看,多梅尼克说:

done 的工作将通过将未处理的拒绝跟踪功能集成到开发工具中来完成。据我以及我自己的了解,大多数 TC39ers 认为这足以使规范完整。


规范委员会不仅仅忽视了.done,他们认为这是不必要的并且容易出错。新的现代 Promise 库会自动检测未处理的拒绝 - 这方面的两个例子是 When Promise 和 Bluebird Promise 率先提出了这个想法。

.done是一个工件 - 源于浏览器无法检测到未处理的拒绝的事实。事实是,确定性地检测它们是不可能的,但在绝大多数情况下这是完全可能的。

不相信我?打开 Firefox 并体验其原生承诺:

p = new Promise(function (resolve, reject) {
    throw 'err';
});
// Logs as error: Unhandled error: `err`

简而言之 - Firefox 使用垃圾收集钩子来确定 Promise 是否处于未处理状态,并触发默认在屏幕上写入的全局错误处理程序。

现在的问题是原生 Promise 还不是很可用 - 因为在 IE 中它们不存在,并且 Chrome 中未处理的拒绝检测尚未实现 - 但它即将到来并且将会存在。同时,您可以使用 ES6 兼容库(例如 Bluebird),它将为您执行拒绝跟踪。

如果你想完成polyfill(我strongly推荐反对) - torazaburo 的 polyfill 有一些缺点。它在承诺原型上声明了一个可枚举属性,通常这不是规范的设计方式 - 您应该subclass承诺是为了扩展它们而不是修补它们 - 遗憾的是目前没有实现支持这一点。

简而言之:

  • 等待原生 Promise 稳定后再使用它们 - 同时您可以使用实现规范的库,例如 Bluebird。当它稳定时没有.done根本不会成为问题。
  • 利用模式来检测错误 - 例如签出处理器模式 https://stackoverflow.com/questions/26627402/javascript-native-promise-execute-callback-on-both-results/26627948#26627948 here.
  • 在可用时使用开发人员工具,长堆栈跟踪和异步调试是很大的优点。另请注意,如果您想要有意义的堆栈跟踪,则不应抛出字符串。

祝你好运,编码愉快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript ES6 承诺支持“done”api 吗? 的相关文章

  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • 为什么 Eclipse 有时会对 JavaScript 中的数组数组发出警告?

    在 Eclipse 中 以下 JavaScript 行 var a1 1 2 3 4 生成警告 Type mismatch cannot convert from Number to any Type mismatch cannot con
  • WebGL iOS 渲染为浮点纹理

    我正在尝试在 iOS Safari 上的 WebGL 中渲染浮点纹理 而不是在本机应用程序中 我已经设法让 iOS 读取手动 例如从 JavaScript 创建的浮点纹理 但是当我创建浮点类型的帧缓冲区并使用 GPU 渲染到其中时 它不起作
  • 我无法注入带有“!important”规则的样式[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码注入样式 document body style color green important Per CSS 级联引用 http www w3 org TR CSS2 cascade html
  • moment.calendar() 没有时间

    我想使用不带时间的 moment calendar 选项 所以而不是 上周二下午 5 点 我想要 上周二 有人知道 Moment 现在是否有解决方案吗 我找到了这个小提琴http jsfiddle net nawxZ http jsfidd
  • 如何将元素的每个单词包装在span标签中?

    div date contents filter function return this nodeType 1 wrap span span 我是新手 认为代码可以解决问题 但它将所有内容都包含在 span 像这样 div class d
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用
  • JQuery 可排序嵌套可排序 div

    这个问题与这个有关Nest jQuery UI 可排序 https stackoverflow com questions 19129476 nest jquery ui sortables 但我无法解决我的问题 问题是 我有一个包含项目的
  • Backbone.js 与 Google 地图 - 有关此问题和侦听器的问题

    我有一个为 Google Maps v3 创建的模块 我正在尝试将其转换为 Backbone js 视图构造函数 到目前为止 这是我的视图模块 我将解释代码后遇到的问题 pg views CreateMap Backbone View ex
  • 在js中检测浏览器的最佳方法

    JavaScript 中有很多浏览器检测方法 据我所知 使用navigator userAgent或检测特征 例如XMLHttpRequest 等等 谁能告诉我哪种方法最好 最有效 如果你真的需要知道什么browser他们正在使用 你主要需
  • 从 url 角度加载模板并在 div 内编译

    由于我是 Angular JS 的新手 我想知道如何加载外部模板并将其与一些数据一起编译到目标中div 例如我有这个模板
  • json、rails、javascript 中的解析错误

    我需要将 ruby 数组放入 javascript 数组中 但出现解析错误 var characters 这就是我将 ruby 嵌入到内联 javascript 中的方式 但它出现了解析错误 我应该如何将此 ruby 数组放入 javasc
  • 动态地将 .on() 方法与事件映射绑定

    我使用此语法来确保事件绑定动态添加li元素 ul list on click li function do something 我尝试使用这样的事件映射来存档相同的内容 ul list hammer css hacks false on s
  • 如何按值删除数组中的多个项目?

    我正在尝试做一个removeAll 函数 它将删除具有该特定值 而不是索引 的数组的所有元素 当我们对循环进行任何更改时 棘手的部分就出现了 索引往往会移动 使其很难像我们想要的那样工作 并且每次更改时都重新启动循环 这在大数组上效率非常低
  • 您网站上的自定义 jQuery 脚本有多少行代码?多少才算是太多呢?

    对于我们的网站 我使用了大量 jQuery 现在我正在查看基础库顶部的 340 行 jQuery 代码 多少是太多了 我将添加更多内容 我什么时候开始尝试压缩代码并最终转向 OOP 行数并不意味着什么 重要的是你实际上在做什么 您可能拥有
  • javascript onclick 进入新窗口

    这是我的代码
  • 我将 X Y Z 坐标转换为屏幕 X Y 坐标有什么问题吗?

    我正在制作 3D 空间中弹跳的球体的 HTML5 Canvas 演示 这非常简单 每个球都有 X Y 和 Z 坐标 然后 这些坐标将转换为我在此处阅读的屏幕 X 和 Y 坐标 http answers google com answers
  • backbone.js:视图中影响集合中不同模型的按钮

    我刚刚开始使用backbone js 到目前为止 我真的很喜欢它 我有这样的事情 ModelA ModelB ViewA ViewB ModelA 持有 ModelB 的集合 如何使用按钮构建模型 B 的视图 单击该按钮会更改集合中下一个
  • 需要根据用户选择有条件地渲染具有 X 行数的部分

    我有一个反应组件 其中包含一个下拉列表 其中的选项包括none 1 5 and 13 根据用户选择的数字 我需要渲染一个部分 其中包括许多行 每个行都有字段名称和下拉列表 如果用户不选择任何一个 我需要整个附加配置部分消失 新部分中的每个下

随机推荐