Promise.all和Promise.race的区别和使用场景

832 阅读2分钟
  1. Promise.all 可以将多个实例组装个成一个新实例,成功的时候返回一个成功的数组;失败的时候则返回最先被reject失败状态的值。

适用场景:比如当一个页面需要在很多个模块的数据都返回回来时才正常显示,否则loading。

比如当数组里的P1,P2都执行完成时,页面才显示。

值得注意的是,返回的数组结果顺序不会改变,即使P2的返回要比P1的返回快,顺序依然是P1,P2

let wake = (time) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(`${time / 1000}后醒来`);
        });
    });
};
let p1 = wake(10000);
let p2 = wake(2000);
Promise.all([p1, p2])
    .then((res) => {
        let [res1, res2] = res;
        console.log(res1);
        console.log(res2);
    })
    .catch((err) => {
        console.log(err);
    });
  1. Promise.race

意为赛跑的意思,也就是数组中的任务哪个获取的块,就返回哪个,不管结果本身是成功还是失败。一般用于和定时器绑定,比如将一个请求和三秒的定时器包装成Promise实例,加入到Promise队列中,请求三秒中还没有回应时,给用户一些提示或相应的操作。常见使用场景:把异步操作和定时器放在一起,如果定时器触发,认为超时,告知用户

let p3 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("success");
    }, 1000);
});
let p4 = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject("faild");
    }, 2000);
});
Promise.race([p3, p4])
    .then((res) => {
        console.log(res);
    })
    .catch((err) => {
        console.log(err);
    });
区别:
  • Promise.all中所有的子Promise都会执行,当所有的子Promise都完成,该Promise完成,返回值是全部值的数组;如果有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果
  • Promise.race只会执行会快的子Promise,有任意一个返回成功后,就算完成,但是进程不会立即停止