捕获未处理的Promise错误方法


Posted in Javascript onOctober 13, 2017

为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。

使用Promise编写异步代码时,使用reject来处理错误。有时,开发者通常会忽略这一点,导致一些错误没有得到处理。例如:

function main() {
asyncFunc()
.then(···)
.then(() => console.log('Done!'));
}

由于没有使用catch方法捕获错误,当asyncFunc()函数reject时,抛出的错误则没有被处理。

这篇博客将分别介绍在浏览器与Node.js中,如何捕获那些未处理的Promise错误。

浏览器中未处理的Promise错误

一些浏览器(例如Chrome)能够捕获未处理的Promise错误。

unhandledrejection

监听unhandledrejection事件,即可捕获到未处理的Promise错误:

window.addEventListener('unhandledrejection', event => ···);

这个事件是PromiseRejectionEvent实例,它有2个最重要的属性:

promise: reject的Promise

reason: Promise的reject值

示例代码:

window.addEventListener('unhandledrejection', event =>
{
console.log(event.reason); // 打印"Hello, Fundebug!"
});
 
function foo()
{
Promise.reject('Hello, Fundebug!');
}
 
foo();

Fundebug的JavaScript错误监控插件监听了unhandledrejection事件,因此可以自动捕获未处理Promise错误。

rejectionhandled

当一个Promise错误最初未被处理,但是稍后又得到了处理,则会触发rejectionhandled事件:

window.addEventListener('rejectionhandled', event => ···);

这个事件是PromiseRejectionEvent实例。

示例代码:

window.addEventListener('unhandledrejection', event =>
{
console.log(event.reason); // 打印"Hello, Fundebug!"
});
 
window.addEventListener('rejectionhandled', event =>
{
console.log('rejection handled'); // 1秒后打印"rejection handled"
});
 
 
function foo()
{
return Promise.reject('Hello, Fundebug!');
}
 
var r = foo();
 
setTimeout(() =>
{
r.catch(e =>{});
}, 1000);

Node.js中未处理的Promise错误

监听unhandledRejection事件,即可捕获到未处理的Promise错误:

process.on('unhandledRejection', (reason, promise) => ···);

示例代码:

process.on('unhandledRejection', reason =>
{
console.log(reason); // 打印"Hello, Fundebug!"
});
 
function foo()
{
Promise.reject('Hello, Fundebug!');
}
 
foo();

注: Node.js v6.6.0+ 默认会报告未处理的Promise错误,因此不去监听unhandledrejection事件也没问题。

Fundebug的Node.js错误监控插件监听了unhandledRejection事件,因此可以自动捕获未处理Promise错误。

以上这篇捕获未处理的Promise错误方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中复制行和删除行的操作实例
Jun 25 Javascript
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
Jul 27 Javascript
vue.js使用3DES加密的方法示例
May 18 Javascript
详解如何在Vue里建立长按指令
Aug 20 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
Sep 25 Javascript
JavaScript使用类似break机制中断forEach循环的方法
Nov 13 Javascript
echarts多条折线图动态分层的实现方法
May 24 Javascript
微信小程序后台持续定位功能使用详解
Aug 23 Javascript
vue通过过滤器实现数据格式化
Jul 20 Javascript
Element Tooltip 文字提示的使用示例
Jul 26 Javascript
基于JavaScript的数据结构队列动画实现示例解析
Aug 06 Javascript
解决ie img标签内存泄漏的问题
Oct 13 #Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
Oct 13 #jQuery
vue2组件之select2调用的示例代码
Oct 12 #Javascript
vue2.x select2 指令封装详解
Oct 12 #Javascript
一个简易时钟效果js实现代码
Mar 25 #Javascript
微信小程序实现页面跳转传值的方法
Oct 12 #Javascript
微信小程序 页面滑动事件的实例详解
Oct 12 #Javascript
You might like
德生PL660的电路分析和打磨
2021/03/02 无线电
CodeIgniter模板引擎使用实例
2014/07/15 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
php浏览历史记录的方法
2015/03/10 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
Python的函数的一些高阶特性
2015/04/27 Python
深入理解Python中装饰器的用法
2016/06/28 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Python高斯消除矩阵
2019/01/02 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python地震数据可视化详解
2019/06/18 Python
Python 代码调试技巧示例代码
2020/08/11 Python
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
安全横幅标语
2014/06/09 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
优秀教师申报材料
2014/12/16 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
军训通讯稿范文
2015/07/18 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL