理解与使用Promise.all 与 Promise.race

es6中Promise对象的 all方法与race方法使用

Promise.all

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例,同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

例如:创建两个都会返回成功的Promise,调用Promise.all方法,会在所有结果都返回成功之后返回结果数组,并且,结果数组的顺序与all方法传入的顺序相同

let p1 = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve('p1');
    },2000);
});
let p2 = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve('p2');
    },1000);
});

Promise.all([p1,p2]).then((res)=>{
    console.log(res);
}).catch((err)=>{
    console.log(err);
})

如果有两个Promise,一个返回成功,一个返回失败,调用Promise.all方法会返回什么结果呢?

let p1 = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve('p1');
    },2000);
});
//p2返回失败
let p2 = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        reject('error-p2');
    },0);
});
Promise.all([p1,p2]).then((res)=>{
    console.log(res);
}).catch((err)=>{
    console.log(err);// error-p2
})

如上代码,Promise.all方法返回的新Promise实例会进入catch回调,并且返回最先被reject失败状态的值 error-p2

Promise.all在处理多个异步方法返回结果时比较方便 实际使用场景也很多,例如,页面加载依赖于多个ajax请求返回结果

Promise.race

Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例 Promise.race()方法会返回最先获取结果的promise,不管返回的是成功的结果还是失败的结果

例如:

let p1 = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve('p1');
    },2000);
});
//p2返回失败
let p2 = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        reject('error-p2');
    },0);
});

Promise.race([p1,p2]).then((res)=>{
    console.log(res);
}).catch((err)=>{
    console.log(err);// error-p2
})

上面代码我们创建了两个Promise对象 p1、p2调用Promise.race方法后,Promise.race返回的新Promise对象会进入失败状态,并返回p2的失败结果,因为p2比p1先拿到结果

实际使用场景中除了可以测试多个接口请求速度之外,还没想到其他的使用场景