- 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);
});
- 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,有任意一个返回成功后,就算完成,但是进程不会立即停止