等待所有promise都完成,Promise.all()

Promise.all()方法用于等待一组Promise全部完成或首个失败。它接受一个可迭代对象作为参数,返回一个新的Promise实例。若所有Promise成功,则返回的Promise将解析为一个数组,包含每个Promise的结果;若任一Promise失败,返回的Promise将拒绝,并带有首个失败Promise的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中  promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

语法

Promise.all(iterable);

参数

iterable

一个可迭代对象,如 Array 或 String

 

Promise.all 的使用

Promise.all 等待所有都完成(或第一个失败)。

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
}); 

Promise.all([p1, p2, p3]).then(values => { 
  console.log(values); // [3, 1337, "foo"] 
});

如果参数中包含非 promise 值,这些值将被忽略,但仍然会被放在返回数组中(如果 promise 完成的话):

// this will be counted as if the iterable passed is empty, so it gets fulfilled
var p = Promise.all([1,2,3]);
// this will be counted as if the iterable passed contains only the resolved promise with value "444", so it gets fulfilled
var p2 = Promise.all([1,2,3, Promise.resolve(444)]);
// this will be counted as if the iterable passed contains only the rejected promise with value "555", so it gets rejected
var p3 = Promise.all([1,2,3, Promise.reject(555)]);

// using setTimeout we can execute code after the stack is empty
setTimeout(function(){
    console.log(p);
    console.log(p2);
    console.log(p3);
});

// logs
// Promise { <state>: "fulfilled", <value>: Array[3] }
// Promise { <state>: "fulfilled", <value>: Array[4] }
// Promise { <state>: "rejected", <reason>: 555 }

Promise.all 的异步和同步

下面的例子中演示了 Promise.all 的异步性(如果传入的可迭代对象是空的,就是同步):

// we are passing as argument an array of promises that are already resolved,
// to trigger Promise.all as soon as possible
var resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];

var p = Promise.all(resolvedPromisesArray);
// immediately logging the value of p
console.log(p);

// using setTimeout we can execute code after the stack is empty
setTimeout(function(){
    console.log('the stack is now empty');
    console.log(p);
});

// logs, in order:
// Promise { <state>: "pending" } 
// the stack is now empty
// Promise { <state>: "fulfilled", <value>: Array[2] }

如果 Promise.all 失败,也是一样的:

var mixedPromisesArray = [Promise.resolve(33), Promise.reject(44)];
var p = Promise.all(mixedPromisesArray);
console.log(p);
setTimeout(function(){
    console.log('the stack is now empty');
    console.log(p);
});

// logs
// Promise { <state>: "pending" } 
// the stack is now empty
// Promise { <state>: "rejected", <reason>: 44 }

但是,Promise.all 当且仅当传入的可迭代对象为空时为同步:

var p = Promise.all([]); // will be immediately resolved
var p2 = Promise.all([1337, "hi"]); // non-promise values will be ignored, but the evaluation will be done asynchronously
console.log(p);
console.log(p2)
setTimeout(function(){
    console.log('the stack is now empty');
    console.log(p2);
});

// logs
// Promise { <state>: "fulfilled", <value>: Array[0] }
// Promise { <state>: "pending" }
// the stack is now empty
// Promise { <state>: "fulfilled", <value>: Array[2] }

Promise.all 的快速返回失败行为

Promise.all 在任意一个传入的 promise 失败时返回失败。例如,如果你传入的 promise中,有四个 promise 在一定的时间之后调用成功函数,有一个立即调用失败函数,那么 Promise.all 将立即变为失败。

var p1 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 1000, 'one'); 
}); 
var p2 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 2000, 'two'); 
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 3000, 'three');
});
var p4 = new Promise((resolve, reject) => {
  setTimeout(resolve, 4000, 'four');
});
var p5 = new Promise((resolve, reject) => {
  reject('reject');
});

Promise.all([p1, p2, p3, p4, p5]).then(values => { 
  console.log(values);
}, reason => {
  console.log(reason)
});

//From console:
//"reject"

//You can also use .catch
Promise.all([p1, p2, p3, p4, p5]).then(values => { 
  console.log(values);
}).catch(reason => { 
  console.log(reason)
});

//From console: 
//"reject"
### Promise.allPromise.allSettled 的区别及用法 #### 1. 基本行为 Promise.all 接收一个包含 Promise 的可迭代对象,并等待所有 Promise 完成。只有当所有 Promise 都成功(fulfilled)时,它才会返回一个包含所有结果的数组[^1]。如果任何一个 Promise 失败(rejected),整个 Promise.all 将立即被拒绝,并返回第一个失败的 Promise 的错误原因。 相比之下,Promise.allSettled 同样接收一个包含 Promise 的可迭代对象,但它会等待所有 Promise 完成,无论它们是成功还是失败。它的返回值是一个数组,其中每个元素都是一个对象,表示对应 Promise 的最终状态(fulfilled 或 rejected),以及对应的值或错误原因[^3]。 #### 2. 返回值 - **Promise.all**: - 成功时:返回一个数组,数组中的每个元素是传入的 Promise结果,顺序与传入的 Promise 顺序一致。 - 失败时:返回第一个失败的 Promise 的错误原因,并忽略其他 Promise结果。 - **Promise.allSettled**: - 返回一个数组,数组中的每个元素是一个对象,包含以下属性: - `status`:Promise 的状态,值为 `'fulfilled'` 或 `'rejected'`。 - `value`(如果状态是 fulfilled):Promise结果。 - `reason`(如果状态是 rejected):Promise 的错误原因。 #### 3. 示例代码 以下是两个方法的使用示例: ```javascript // Promise.all 示例 const promises = [ Promise.resolve(1), Promise.resolve(2), Promise.reject('Error'), ]; Promise.all(promises) .then(values => { console.log(values); // 不会执行,因为有一个 Promise 被拒绝 }) .catch(error => { console.error(error); // 输出: Error }); // Promise.allSettled 示例 const promisesSettled = [ Promise.resolve('Data'), Promise.reject('Network Error'), new Promise(res => setTimeout(res, 100, 'Delay')), ]; Promise.allSettled(promisesSettled) .then(results => { console.log(results.map(r => r.status)); // 输出: ["fulfilled", "rejected", "fulfilled"] console.log(results[0].value); // 输出: Data console.log(results[1].reason); // 输出: Network Error }); ``` #### 4. 差异总览 | 特性 | Promise.all() | Promise.allSettled() | |-------------------|---------------------------------------|------------------------------------------| | 完成条件 | 所有 Promise 必须成功 | 等待所有 Promise 完成(无论成功/失败) | | 返回值 | 成功结果数组 | 包含状态的对象数组 | | 失败行为 | 立即拒绝(首个失败的 Promise) | 不拒绝,返回所有 Promise 的最终状态 | | 适用场景 | 强依赖的并行任务 | 需要完整结果分析的批量操作 | #### 总结 - **Promise.all**:适合所有 Promise 必须成功的场景,一旦某个 Promise 失败,整个调用将立即被拒绝。 - **Promise.allSettled**:适合需要知道所有 Promise 最终状态的场景,无论成功或失败。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值