• Promise.all如果其中之一失败,怎么能够拿到其他成功的结果


    Promise.all 的基础介绍

    作用:Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

    参数:由多个Promise实例组成的数组

    const p = Promise.all([p1, p2, p3]);
    
    • 1

    p的状态由p1、p2、p3决定,分成两种情况。

    (1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

    (2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

    Demo–Promise.all如果其中之一失败,怎么能够拿到其他成功的结果

    该实例的最终结果被Promise.all的catch方法捕获

    如果f3没有自己的catch方法,就会调用Promise.all()的catch方法。

    let f1 = new Promise((resolve,reject)=> {
       setTimeout(()=> {
               resolve('f11111')
           },2000)
    })
    let f2 = new Promise((resolve,reject)=> {
           setTimeout(()=> {
               resolve('f22222')
           },1000)
    })
    let f3 = new Promise((resolve,reject)=> {
           setTimeout(()=> {
               reject('err-f33333')
           },3000)
     })
    let a =  [f1,f2,f3]
    // promise.all中的异步请求是并发执行的,但是最终的返回结果是按照最初的顺序执行排列好的
    Promise.all(a).then(data=> { 
       console.log(data)
    }).catch(err=> {
       console.log('糟糕出错了')
    })
    //执行结果:糟糕出错了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。
    let f1 = new Promise((resolve,reject)=> {
           setTimeout(()=> {
               resolve('f11111')
           },2000)
    })
    let f2 = new Promise((resolve,reject)=> {
           setTimeout(()=> {
               resolve('f22222')
           },1000)
    })
    let f3 = new Promise((resolve,reject)=> {
           setTimeout(()=> {
               reject('err-f33333')
           },3000)
     }).catch(err=>err)
    let a =  [f1,f2,f3]
    // promise.all中的异步请求是并发执行的,但是最终的返回结果是按照最初的顺序执行排列好的
    Promise.all(a).then(data=> { 
       console.log(data) 
    }).catch(err=> {
       console.log('糟糕出错了')
    })
    // 执行结果: ['f11111', 'f22222', 'err-f33333']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这个例子中f1,f2会resolved。
    f3首先会rejected,但是f3有自己的catch方法,该方法返回的是一个新的Promise 实例, f3指向的实际上是这个实例. 该实例执行完catch方法后,也会变成resolved。 导致Promise.all()方法参数里面的三个实例都会resolved,因此会调用then方法指定的回调函数,而不会调用catch方法指定的回调函数。

    参考自ES6-Promise.all

  • 相关阅读:
    竞赛开源项目汇总
    Flink技术简介与入门实践
    Springboot集成整合Redis-哨兵集群(4)
    React-Router(V6版本)
    java-net-php-python-jsp卫浴网站管理系统演示录像2019计算机毕业设计程序
    线程理论和实操
    时间空间复杂度分析--插入排序算法
    Domino内置备份功能妙用
    MyBatis简述
    Spring Boot 实现定时任务
  • 原文地址:https://blog.csdn.net/Kratial/article/details/134560823