捕获未处理的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 设置标题的自动翻转
Oct 03 Javascript
{}与function(){}选用空对象{}来存放keyValue
May 23 Javascript
JS中setTimeout()的用法详解
Apr 14 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 Javascript
Angular directive递归实现目录树结构代码实例
May 05 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
Sep 30 Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
Vue组件通信的四种方式汇总
Feb 08 Javascript
详解从Vue-router到html5的pushState
Jul 21 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 Javascript
使用Vue.js和MJML创建响应式电子邮件
Mar 23 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
处理单名多值表单的详解
2013/06/08 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
php递归函数怎么用才有效
2018/02/24 PHP
nginx 设置多个站跨域
2021/03/09 Servers
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
利用Python计算KS的实例详解
2020/03/03 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
九年级物理教学反思
2014/01/29 职场文书
党风廉设责任书
2014/04/16 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
建议书的格式
2014/05/12 职场文书
个人违纪检讨书
2014/09/15 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
欠款起诉书范文
2015/05/19 职场文书
结婚典礼致辞
2015/07/28 职场文书
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技