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

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

实战:

Promise.all([
        this.getSites(),
        this.getAreas()
      ]).then(([sites, allSiteAreaNodes])=>{
    
    
        let allNodes = [];
        let allAreaNodesGroups = _.groupBy(allSiteAreaNodes, 'SiteID');
        
        }

对Promise.all进行讲解:

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

上面代码中,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 无数据"]

猜你喜欢

转载自blog.csdn.net/weixin_43131046/article/details/126928824