捕获未处理的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判断一个字符串是否包含一个子串的方法
Jan 26 Javascript
JavaScript父子窗体间的调用方法
Mar 31 Javascript
初步使用bootstrap快速创建页面
Mar 03 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
Jun 14 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
Aug 02 Javascript
js判断PC端与移动端跳转
Dec 24 Javascript
Vue与Node.js通过socket.io通信的示例代码
Jul 25 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 Javascript
Vue-CLI项目中路由传参的方式详解
Sep 01 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
Mar 04 Javascript
Vue实现圆环进度条的示例
Feb 06 Vue.js
解决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
php编写简单的文章发布程序
2015/06/18 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
读jQuery之三(构建选择器)
2011/06/11 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
vue实现拖拽效果
2019/12/23 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
Python中os.path用法分析
2015/01/15 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
Django分组聚合查询实例分享
2020/04/29 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
水果花束:Fruit Bouquets
2017/12/20 全球购物
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
网页美工求职信
2014/02/15 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
师范生小学见习总结
2015/06/23 职场文书
拔河比赛新闻稿
2015/07/17 职场文书