• 解决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
  • 相关阅读:
    【Linux从入门到精通】通信 | 共享内存(System V)
    SSM框架,SpringMVC框架的学习(上)
    SpringBoot 整合 Minio 实现 文件上传
    LeetCode-组合总和 II
    Linux 中 man手册中函数后面括号数字释义
    经典模型——ResNet
    Leetcode 349.两个数组的交集
    【C++】详细讲解结构体的使用,带你玩转C++结构体~
    尚硅谷-设计模式篇
    大白话深入浅出讲嵌入式C语言多线程编程
  • 原文地址:https://blog.csdn.net/weixin_43131046/article/details/126928824