关于promise.all的一个用法

关于promise.all的一个用法

老师,查询了一下promise.all的具体用法中有提到,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()catch方法。

例如:

https://img1.sycdn.imooc.com//climg/6335964909e96a5e04830481.jpg

此时是不是应该理解为,因为p2自己catch了自己的错误,又由于“Promise对象抛出的错误不会传递到外层代码,即不会有任何反应”,所以对于promise.all来说,它接收到的p2状态还是fulfilled的成功态?所以最后返回p1,p2这两个的返回值作为数组返回给promise.all并打印出来。不知道这么理解对吗

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕久久 2022-09-30 09:51:10

同学你好,理解的不对:

1、同学传入Promise.all方法中的p1、p2,并不是同学理解的Promise对象:

https://img1.sycdn.imooc.com//climg/63364933090f9c3305960351.jpg

二者是调用了then、catch方法之后的promise对象,比如(图二):

https://img1.sycdn.imooc.com//climg/6336495d098f039a06440193.jpg

2、由于图二中的then方法并没有再次更改Promise的状态,所以默认返回一个新的成功状态的Promise对象:

https://img1.sycdn.imooc.com//climg/633649c909dee27a05820150.jpg

同理,p2的catch方法中也没有手动再次更改Promise的状态,所以也是返回一个新的成功状态的promise。

由于p1、p2都是成功的,所以all方法会执行then中的语句。

3、可以调成如下形式对比一下:

 const p1=new Promise((resolve,reject)=>{
    resolve("hello")
  })
  p1.then(result=>console.log("p1",result))
  .catch(e=>e)

  const p2=new Promise((resolve,reject)=>{
    throw new Error("报错了")
  })
  p2.then(result=>result)
  .catch(e=>console.log("p2",e))  


  Promise.all([p1,p2])
  .then(result=>console.log("all-成功",result))
  .catch(e=>console.log("all-失败",e))

祝学习愉快!

  • 提问者 困惑小张 #1

    老师那是不是可以这样理解,就是catch的作用就是捕获Promise对象的报错也就是reject状态,当p2里的reject被catch捕获了之后,对于外界来说,p2整体就是一个成功的状态,但是如果p2没有写catch,那对外界来说它的整体就是一个失败的状态?

    2022-09-30 10:59:31
  • 好帮手慕久久 回复 提问者 困惑小张 #2

    可以这样理解。确认来讲,p2如果被catch处理了失败状态,那么整体实际上就变成了p3,即变成了一个新的Promise对象

    https://img1.sycdn.imooc.com//climg/63365d55099f034b07030269.jpg

    p3整体是成功的。

    而没处理错误,p2就是失败的:

    https://img1.sycdn.imooc.com//climg/63365dce091ab93b06310146.jpg

    2022-09-30 11:08:18
  • 提问者 困惑小张 回复 好帮手慕久久 #3

    好的明白了,谢谢老师!

    2022-09-30 11:18:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师