捕获未处理的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 相关文章推荐
jquery 多级下拉菜单核心代码
May 21 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
Feb 20 Javascript
bootstrap基础知识学习笔记
Nov 02 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
react-native-fs实现文件下载、文本存储的示例代码
Sep 22 Javascript
JavaScript数组排序reverse()和sort()方法详解
Dec 24 Javascript
基于vue中解决v-for使用报红并出现警告的问题
Mar 03 Javascript
vue mint-ui tabbar变组件使用
May 04 Javascript
从源码里了解vue中的nextTick的使用
Nov 22 Javascript
vue子传父关于.sync与$emit的实现
Nov 05 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 XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
python通过加号运算符操作列表的方法
2015/07/28 Python
Python正则表达式使用经典实例
2016/06/21 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
python爬虫超时的处理的实例
2018/12/19 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
python Scrapy框架原理解析
2021/01/04 Python
Python实现京东抢秒杀功能
2021/01/25 Python
PHP如何自定义函数
2016/09/16 面试题
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
大学毕业生个人总结
2015/02/28 职场文书
旷工辞退通知书
2015/04/17 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书