捕获未处理的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 相关文章推荐
JavaScript 基于原型的对象(创建、调用)
Oct 16 Javascript
jQuery数组处理方法汇总
Jun 20 Javascript
关于js类的定义
Jun 28 Javascript
Javascript玩转继承(三)
May 08 Javascript
js加入收藏夹代码(兼容ie/ff/op)
May 16 Javascript
jquery实现人性化的有选择性禁用鼠标右键
Jun 30 Javascript
js实现鼠标悬浮给图片加边框的方法
Jan 30 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
Aug 11 Javascript
详解JavaScript逻辑Not运算符
Dec 04 Javascript
js操作DOM--添加、删除节点的简单实例
Jul 08 Javascript
jQuery中deferred对象使用方法详解
Jul 14 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
php 设计模式之 单例模式
2008/12/19 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
JavaScript实现单例模式实例分享
2017/12/22 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
vue的for循环使用方法
2019/02/12 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
vue监听键盘事件的相关总结
2021/01/29 Vue.js
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
python中遍历文件的3个方法
2014/09/02 Python
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
Python模拟用户登录验证
2017/09/11 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
结婚喜宴家长答谢词
2014/01/15 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
商场租赁意向书
2014/07/30 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
预备党员群众意见
2015/06/01 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书