Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

unhandledrejection 事件捕获 Promise 错误

  当我们希望在浏览器上捕获全局错误时会监听 window 对象的 error 事件,可是 error 事件只是捕获错误而已,对于 Promise 的 reject 未处理是不会触发的。如今在业务代码中我们越来越多地使用 Promise,导致很多被放在 Promise 中处理的逻辑错误仅仅是被 reject 没有触发 error。
  通过 unhandledrejection 事件,我们就可以捕获未处理的 reject 。
<script> addEventListener('error', error => { console.log(error); // 不会触发 }); addEventListener('unhandledrejection', error => { console.log(error.promise); // 可以触发,而且还可以直接拿到 promise 对象 }); Promise.reject(233); </script>   所谓「未处理的 reject」确切地说应该是「未及时处理的 reject」,因为在业务上我们有时候会把 promise 对象保存下来,做完某个其它异步操作后再处理。这时候「及时」这个概念就有点复杂了,比如下面的例子虽然有处理 reject,但由于晚了几毫秒,没赶上「及时」,因此 unhandledrejection 事件依然会被触发:
<script> addEventListener('unhandledrejection', error => { console.log(error.promise); }); const $promise = Promise.reject(233); setTimeout(() => { $promise.catch(reason => { console.log(reason); }); }); </script>   由于是比较新的东西,所以目前 unhandledrejection 事件的兼容性还比较渣,不过我觉得这确实是一个有价值的事件,所以将来很可能会普及起来。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^