1、Promise.all:
- 当所有的Promise都成功(resolve)时,
Promise.al
l返回一个包含所有Promise结果的数组。 - 如果任何一个Promise被拒绝(reject),
Promise.all
会立即返回一个被拒绝的Promise,并带有第一个被拒绝Promise的错误信息。 - 结果数组的顺序与传入的Promise数组的顺序相同。
2、Promise.allSettled:
Promise.allSettled
返回一个Promise,该Promise在所有的Promise都已完成(不管是成功还是失败)后解析。- 返回的Promise最终会以一个包含每个Promise结果的对象数组的形式进行解析。
- 每个对象具有
status
和value
属性:status
可为字符串"fulfilled"
表示成功、或字符串"rejected"
表示拒绝。value
属性存储了已解决或已拒绝的值。
Promise.allSettled
不会中断执行,而是等待所有Promise都解决或拒绝,然后返回结果。
总结:
Promise.all
在全部成功时才返回,一旦有Promise被拒绝,立即返回拒绝的Promise。Promise.allSettled
会等待所有Promise都完成(无论成功与否),并以一个包含每个Promise结果的对象数组的形式返回。
使用Promise.all
时,如果你希望在任何一个Promise被拒绝时立即中断执行并处理错误,你可以结合使用.catch
方法来捕获错误。而对于Promise.allSettled
,你可以在最后统一处理每个Promise的结果,无论成功与否。
// 创建三个使用 axios 发送请求的 promise
let p1 = axios.get("https://jsonplaceholder.typicode.com/todos/1");
let p2 = axios.get("https://jsonplaceholder.typicode.com/todos/2");
let p3 = axios.get("https://jsonplaceholder.typicode.com/todos/3");
使用 Promise.all 或 Promise.allSettled 等待所有的 promise 完成,并处理结果:
// 使用 Promise.all 等待所有的 promise 完成
Promise.all([p1, p2, p3])
.then((results) => {
// results 是 [{status: 200, data: {...}},
// {status: 200, data: {...}},
// {status: 200, data: {...}}]
console.log(results); // 打印结果数组
// 可以对每个结果进行处理,比如打印数据
results.forEach((result) => {
console.log(result.data);
});
})
.catch((error) => {
// 如果有一个 promise 失败,就会进入这里,并打印失败原因
console.error(error);
});
// 使用 Promise.allSettled 等待所有的 promise 完成
Promise.allSettled([p1, p2, p3]).then((results) => {
// results 是 [{status: "fulfilled", value: {status: 200, data: {...}}},
// {status: "fulfilled", value: {status: 200, data: {...}}},
// {status: "fulfilled", value: {status: 200, data: {...}}}]
console.log(results); // 打印结果数组
// 可以对每个结果进行处理,比如根据状态判断是否成功
results.forEach((result) => {
if (result.status === "fulfilled") {
// 如果成功,打印数据
console.log(result.value.data);
} else {
// 如果失败,打印失败原因
console.error(result.reason);
}
});
});