捕获未处理的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兼容性测试实例
Jul 01 Javascript
javascript与cookie 的问题详解
Nov 11 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
告诉你什么是javascript的回调函数
Sep 04 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
Mar 13 Javascript
微信js-sdk地理位置接口用法示例
Oct 12 Javascript
三种方式实现瀑布流布局
Feb 10 Javascript
jquery实现左右轮播图效果
Sep 28 jQuery
浅谈如何使用 webpack 优化资源
Oct 20 Javascript
基于vue配置axios的方法步骤
Nov 09 Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 Javascript
js实现盒子滚动动画效果
Aug 09 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中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
python的id()函数介绍
2013/02/10 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python多线程抽象编程模型详解
2019/03/20 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
python 循环数据赋值实例
2019/12/02 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
社区活动总结报告
2014/05/05 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
法定代表人身份证明书
2015/06/18 职场文书
九年级化学教学反思
2016/02/22 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers