• 解决promise.all() 时,一个出错,都不执行的核心


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

    实战:
    Promise.all([
            this.getSites(),
            this.getAreas()
          ]).then(([sites, allSiteAreaNodes])=>{
            let allNodes = [];
            let allAreaNodesGroups = _.groupBy(allSiteAreaNodes, 'SiteID');
            
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    对Promise.all进行讲解:
    const p = Promise.all([p1, p2, p3]);
    
    • 1

    上面代码中,Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。

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

    Promise.all的不足之处:

    Promise.all的特性 是会执行里面的所有异步操作,遇到抛错就取消执行,并不会继续往下执行了。
    有时我们 需要能继续执行下去。这样也是有方法能实现的…

        // 代码 解决:在catch里面resolve就行了
        // 测试了下 解决方式还能实现
        var p1 = new Promise(resolve => {
            let p1Data = b;
            resolve(p1Data)
        }).catch(err => {
            return Promise.resolve("P1 无数据")
        })
        var p2 = new Promise(resolve => {
            let p2Data = 'p2的有数据';
            resolve(p2Data)
        }).catch(err => {
            return Promise.resolve("P2 无数据")
        })
        Promise.all([p1, p2]).then(res => {
            console.log(res);
        }).catch(err => {
            throw new Error("Promise 执行错误", err)
        })
       // ["P1 无数据","P2 无数据"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    ElasticSearch DSL语法
    德人合科技 | 天锐绿盾终端安全管理系统
    Win通过WSL配置安装Redis
    深入浅出PyTorch——模型定义
    数据库、数据中台、数据仓库、数据湖区别
    大数据Spark教程从入门到精通第四篇:Spark快速上手
    java实现数据库自动异地备份
    Java二十三种设计模式-享元模式(12/23)
    Golang标准包time总结
    java创建线程的3种方式
  • 原文地址:https://blog.csdn.net/weixin_43131046/article/details/126928824