Promise API 简介
all,allSettled,any,race,这4个方法的参数都是一个数组。
Promise.all([])
- 当参数数组中所有Promise实例的结果成功时,按照请求顺序返回成功的结果;
- 当参数数组中只要有一个Promise实例的结果失败时,则进入失败的回调。
const p1 = new Promise((resolve, reject) => {
resolve(1);
})
const p2 = new Promise((resolve, reject) => {
resolve(1);
})
const p3 = Promise.resolve('ok');
// 所有promise成功,则result成功,且结果值为3个结果值组成的一个数组
const result = Promise.all([p1, p2, p3]); // 3个均成功,可以用result.then()获取成功的结果数组
// 若有一个失败,则结果为失败,且最终的值是失败的promise对象的值
Promise.allSettled([])
- 执行结果不会失败,返回一个数组,分别对应参数数组中各个Promise实例的状态。
const p1 = Promise.resolve(1);
const p2 = Promise.reject(-1);
Promise.allSettled([p1, p2]).then(res=>{
console.log(res);
}
// res打印如下:
/*
[
{ status: 'fulfilled', value: 1 },
{ status: 'rejected', reason: -1 }
]
*/
Promise.any([])
- 只要参数promise数组有一个变成
fulfilled,最后any返回的实例就会变成fulfilled,并且返回第一个成功的promise的值; - 如果数组中所有的promise都变成
rejected,最后就会变成rejected状态。
const p1 = new Promise((resolve, reject) => {
reject(1);
});
const p2 = new Promise((resolve, reject) => {
reject(2);
});
const p3 = Promise.resolve("ok");
Promise.any([p1, p2, p3]).then(
(r) => console.log(r), // 打印出'ok'
(e) => console.log(e)
);
Promise.race([])
- 只要参数 Promise 数组中有一个实例率先改变状态,则 race 方法的返回状态就跟着改变;
- 率先改变状态的 Promise 实例的返回值,会传递给 race 方法的回调函数。
// 案例1
const p1 = new Promise((resolve) => {
setTimeout(() => {
resolve(1);
}, 3000);
});
const p2 = new Promise((resolve) => {
setTimeout(() => {
resolve(2);
}, 2000);
});
Promise.race([p1, p2]).then(
(v) => {
console.log(v); // 打印2
},
(e) => {
console.log(e);
}
);
// 案例2
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
}, 3000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(20);
}, 2000);
});
Promise.race([p1, p2]).then(
(v) => console.log(v),
(e) => console.log(e) // 打印20
);
// 案例3
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
}, 3000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
throw new Error("我出错了");
}, 2000);
});
Promise.race([p1, p2]).then(
(v) => console.log(v), // 打印10
(e) => console.log(e)
);
- 抛出一个异常不会改变race的状态,所以案例3依然是由p1决定了race的状态。