你是否也在学习es6promise时遇到过这个问题?

郭某某01 郭某某01     2022-09-04     329

关键词:

背景

周末闲来无事,随便翻看了一下阮一峰老师的《ES6 标准入门》第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版;当看到第16章第4节 'Promise.prototype.catch()'时,遇到了一个小困惑,下面我们来一起看一下

 

开胃汤

首先,Promise.prototype.catch方法是用来'捕获Promise回调函数中自然发生或主动抛出的错误',何为自然发生?何为主动抛出?

自然发生的错误:

1 function a() {
2   var x = 1;
3   console.log(x+y) 
4 }
5 
6 a() // 'ReferenceError: y is not defined'

变量y未定义,所以运行时产生了错误,这就是自然发生的错误,我们没有做异常处理,即try catch

主动抛出的错误:

 1 function a() {
 2   var x = 1;
 3   try{
 4     console.log(x+y)
 5   }catch(err){
 6     console.log(err)
 7   }  
 8 }
 9 
10 a() // 'ReferenceError: y is not defined'

意识到可能会有异常出现,我们就用try catch处理,那我们如何区分一个错误是否被捕获到了呢?很简单,就是看浏览器控制台的日志:

未捕获到的错误日志是红色的

捕获到的错误日志是黑色的

 

正餐

上面已经说了Promise.prototype.catch的作用,以及错误的相关知识,那么我究竟遇到了什么问题呢?咱们继续往下看

书上有这么一个示例:

1 var promise = new Promise(function(resolve, reject){
2   throw new Error('test')
3 })
4 promise.catch(function(error){
5   console.log(error)
6 })
7 // Error: test

那我们就手动实践一下吧

错误真的被捕获到了,欧耶,perfect!!突然我又想到Promise不是用来实现异步操作的吗?那我们就试试ajax吧,然后又意识到没有接口(主要是当时懒得找),那就用SetTimeout代替吧

代码:

 1 new Promise(function (resolve, reject) {
 2 
 3   // 异步方式抛出异常
 4   setTimeout(function () {
 5     throw new Error('出错1')
 6   },2000)
 7 
 8   // 同步方式抛出异常
 9   throw new Error('出错2')
10 }).catch(function (err) {
11   console.log(err)
12 })

运行截图:

纳尼?!错误1没有被捕获?开玩笑呢,让我缓一缓,终于想到了:setTimeout是在Window下执行的,记得不?上面的代码就相当于:

 1 var clock = function () {
 2   setTimeout(function () {
 3     throw new Error('出错1')
 4   })
 5 }
 6 
 7 new Promise(function (resolve, reject) {
 8 
 9   // 异步方式抛出异常
10   clock()
11 
12   // 同步方式抛出异常
13   throw new Error('出错2')
14 }).catch(function (err) {
15   console.log(err)
16 })

当我们执行一个函数时,归根到底就是把函数体内代码拿到它被调用的地方执行;所以在上上个示例中,在Promise实例中只是启动了setTimeout定时器,之后定时器就和Promise实例完全没有关系了,因为它被交由Window对象了,所以定时器中抛出的异常没有想我们想象的被Promise示例捕获,而是未加处理,直接在控制台报错;怎么样?你是否已经理解,如果理解了,我们再巩固一下,看看下面的代码:

 1 var clock = function () {
 2   setTimeout(function () {
 3     console.log(this === window)
 4     throw new Error('出错1')
 5   })
 6 }
 7 
 8 var func = function () {
 9   throw new Error('出错3')
10 }
11 
12 
13 new Promise(function (resolve, reject) {
14   // 异步方式抛出异常
15   clock()
16 
17   // 执行window.func抛出异常
18   func()
19 
20   // 同步方式抛出异常
21   throw new Error('出错2')
22 }).catch(function (err) {
23   console.log(err)
24 })

这里错误3能不能被catch捕获呢?答案是:Yes

不要被迷惑呦!虽然func是在Promise示例外面定义的,但是它和错误2是抛出方式没两样儿

 

结语

这就是我在学习Promise相关知识时遇到的一个小插曲,我不相信只有我一个人有这个经历,哈哈;关于Promise的其他知识这里不是没有介绍,而是丝毫没有介绍,不好意思,我又调皮了,主要是我觉得学习ES6,看阮一峰老师的《ECMAScript 6 入门》就够了,好了,就到这里吧,祝大家周末愉快!!

 

请问大家有遇到过这个问题吗,编辑jsp时eclipse总是卡死

这个应该是你打开的方式不对.Eclipse在编译jsp的时候卡死了.你可以在window-preference-Editors-FileAssociations-Filetypes中找到jsp类型,然后设置它的关联编辑器.系统默认是使用MyeclipseVisualJSPDesigner打开jsp页面的,不过这样打开很慢,因为... 查看详情

盘点英国留学签证面签会问哪些问题

...:1.去英国做什么?2.为什么选择英国?3.在选择英国之前是否考虑过其它国家?或是否和其它国家进行过比较?4.你认为英国与其它国家相比有什么优势吗?或和其它国家比较过什么?5.你是什么时候开始有出国打算的?6.你是什... 查看详情

学习wpf时遇到的问题

如何用WPF制作出QQ聊天窗口里面的这些控件。这其实是由两个button拼接而成的(那也可以是togglebutton,比button的状态要少,但因此也比较省资源)左边是一个content为一张图片的button,右边是content为带三角箭头的button。左边用来... 查看详情

你不得不关注的elasticsearchtopx关键指标(代码片段)

0、题记在写繁重的业务场景下,你是否遇到过Elasticsearch集群的性能问题?你是否遇到过Elasticsearch数据索引化速度限制问题?你是否遇到过搜索花费时间太长而无法执行的延迟问题?你是否遭遇过Elasticsearch集群故障排查的挑战... 查看详情

如何变得聪明

...在我遇到的大部分人会学习的人不多,包括我自己在内,也在摸爬滚打中不停的探索 查看详情

日常使用git,这些问题你遇到过吗?

...户来讲,GitHub上面都有不少优质开源项目可以借鉴和学习。其受欢迎程度还体现在,越来越多的人会主动优化自己的GitHub主页,让其成为求职面试时的加分项。使用Git和基于Git的平台(GitHub和GitLab&#x 查看详情

卸载CUDA工具包时遇到这个问题,怎么办?

...:17【问题描述】:我正在安装CUDA工具包和cuDNN以进行深度学习。我下载了cuDNN库,下载了CUDA工具包,在安装工具包时我得到了这个,我从来没有下载过这个,它一直在那里。然后我搜索了一下,有人说我们必须卸载。这是来自 查看详情

问卷调查

...一学期,你目前在专业学习方面情况如何,有什么收获,是否有什么困难?收获很多,困难也很多2.1你是怎么学习C语言的?(作业,实验,教材,其他),目前为止估算自己写过多少行代码?课堂学习2.2学了C语言,你分的清数... 查看详情

4.27

...一学期,你目前在专业学习方面情况如何,有什么收获,是否有什么困难?学会了helloworld的写法,没有2.1你是怎么学习C语言的?(作业,实验,教材,其他),目前为止估算自己写过多少行代码?作业,1002.2学了C语言,你分的清... 查看详情

让自己更值钱的要诀

...能首先想到的就是到Google、百度上去搜索一下,看看别人是否遇到过类似的需求,是否提供了解决方法。这样做可以使得你的 查看详情

面试题:你在工作/学习过程中遇到过什么深刻问题吗?怎么克服?

最近面试高频问题,回答的一脸懵逼因为面试官,基本都是先问项目中相关知识点以及延申问题,然后询问擅长的技术栈并深挖,最后来一个问题:你遇到的最深刻问题是什么?怎么解决?卧槽,前面两个部... 查看详情

面试题:你在工作/学习过程中遇到过什么深刻问题吗?怎么克服?

最近面试高频问题,回答的一脸懵逼因为面试官,基本都是先问项目中相关知识点以及延申问题,然后询问擅长的技术栈并深挖,最后来一个问题:你遇到的最深刻问题是什么?怎么解决?卧槽,前面两个部... 查看详情

endnote编辑过的格式导出问题。

...项。但是在你关闭editorstyle窗口时,他会弹出一个窗口问是否保存,选择yes之后,就会出现saveas窗口让你填写保存的style名称,但是不能填写保存路径。填完之后这个修改后的style自动会被保存在endnote的style文件夹中。追问非常感... 查看详情

分配工作时需要考虑的问题

...三方或者他之前的履历来衡量他的能力,这是做出这个人是否能胜任这个任务的起步基线。这一步,可能会包含太多的主观性,是要存疑的,要通过后面的步骤来确定。根据对方的反馈确定他是否有综合考虑问题的能力,是否对... 查看详情

深度分析:那些java中你一定遇到过的问题,一次性帮你搞定!深度分析:那些java中你一定遇到过的问题,一次性帮你搞定!

...本数据类型的比较的值相等.类的比较的内存的地址,即是否是同一个对象,在不覆盖equals的情况下,同比较内存地址,原实现也为==,如String等重写了equals方法.hashCode也是Object类的一个方法。返回一个离散的int型整数。在集合类... 查看详情

wcf传输1-你是否使用过压缩或json序列化?

1.当遇到需要传输大量数据时,怎么样传输数据?2.压缩数据有哪几种常见的方式? 问题1解答:通过压缩来传输数据问题2解答:      (1)WCF自带的压缩方式      (2)自定义WCFbind... 查看详情

这个bug你遇到过吗

今天做项目的时候,当我根据文档集成极光推送的时候,需要导入一些framework  然后我用真机iPhone5c调试的时候,出错 程序停止到这里了,而且,点击下一步,程序并没有什么反应,各位大神有知道原因的吗  查看详情

编程类培训机构的5大谎言,你遇到过几个?

...多的伙伴想加入程序员这个大家庭里面来。那么,想学习这一行,最常见的学习方法就是自学、学校有专门的编程课、还有去培训机构学习。其中,去培训机构学习的小伙伴也越来越多。这时候,一些不良的培训... 查看详情