捕获未处理的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获取触发事件元素在整个网页中的绝对坐标(示例代码)
Dec 13 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
AngularJS通过$location获取及改变当前页面的URL
Sep 23 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
Oct 31 Javascript
js时间戳与日期格式之间相互转换
Dec 11 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 Javascript
详解如何在微信小程序中愉快地使用sass
Jul 30 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
小程序数据通信方法大全(推荐)
Apr 15 Javascript
精读《Vue3.0 Function API》
May 20 Javascript
微信小游戏中three.js离屏画布的示例代码
Oct 12 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版(3)
2006/10/09 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
php中namespace及use用法分析
2016/12/06 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
js控制表单操作的常用代码小结
2013/08/15 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Python异常处理操作实例详解
2018/08/28 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
Python socket处理client连接过程解析
2020/03/18 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
Python读写锁实现实现代码解析
2020/11/28 Python
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
酒店总经理助理职责
2014/02/12 职场文书
中药专业自荐信范文
2014/03/18 职场文书
自我推荐信格式模板
2015/03/24 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
在职证明书模板
2015/06/15 职场文书
父亲去世追悼词
2015/06/23 职场文书
投诉书范文
2015/07/02 职场文书
领导离职感言
2015/08/03 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
java开发双人五子棋游戏
2022/05/06 Java/Android