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.
- 在可用时使用开发人员工具,长堆栈跟踪和异步调试是很大的优点。另请注意,如果您想要有意义的堆栈跟踪,则不应抛出字符串。
祝你好运,编码愉快。