捕获未处理的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 FormatNumber函数实现方法
Dec 30 Javascript
javascript 内存回收机制理解
Jan 17 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
Jul 31 Javascript
jQuery实现表头固定效果的实例代码
May 24 Javascript
json数据与字符串的相互转化示例
Sep 18 Javascript
禁用页面部分JavaScript不是全部而是部分
Sep 03 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
Sep 18 Javascript
angular+ionic 的app上拉加载更新数据实现方法
Jan 16 Javascript
快速解决brew安装特定版本flow的问题
May 17 Javascript
基于vue中对鼠标划过事件的处理方式详解
Aug 22 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
Jun 28 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 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中的加密功能
2006/10/09 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
php文件缓存方法总结
2016/03/16 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
JavaScript实用技巧(一)
2010/08/16 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
jQuery实现验证码功能
2017/03/17 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
python并发和异步编程实例
2018/11/15 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
使用Python实现画一个中国地图
2019/11/23 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
法律专业自我鉴定
2013/10/03 职场文书
网页设计个人找工作求职信
2013/11/28 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
吧主申请感言怎么写
2015/08/03 职场文书