乐闻世界logo
搜索文章和话题

Wait for multiple promises to finish

8 个月前提问
6 个月前修改
浏览次数27

1个答案

1

在JavaScript中,如果需要等待多个Promise完成,主要有几种方法可以实现:

1. Promise.all()

这是最常用的方法之一,特别适用于当所有的异步操作都必须成功执行,才能继续执行接下来的操作。Promise.all()接受一个Promise对象的数组作为参数,当所有的Promise对象都成功完成时,它返回一个新的Promise对象。这个新的Promise将会异步完成,并且它的结果是一个包含所有传入Promise结果的数组。

例子:

javascript
let promise1 = Promise.resolve(3); let promise2 = 42; let promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([promise1, promise2, promise3]).then(values => { console.log(values); // 输出: [3, 42, "foo"] }).catch(error => { console.log('有一个Promise失败了:', error); });

2. Promise.allSettled()

Promise.allSettled()是ES2020引入的。与Promise.all()不同,Promise.allSettled()等待所有传入的Promise都被解决或拒绝。返回的新Promise总是会成功解决,其结果是一个数组,其中每个对象代表对应的Promise的结果,无论是成功还是失败。

例子:

javascript
let promise1 = Promise.resolve(3); let promise2 = new Promise((resolve, reject) => { setTimeout(reject, 100, 'rejected'); }); Promise.allSettled([promise1, promise2]).then(results => { results.forEach((result) => { console.log(result.status); // "fulfilled" 或 "rejected" }); });

3. Promise.race()

Promise.race()方法用于多个Promise中返回最快的那个Promise的结果,无论它是解决还是拒绝。它只返回第一个完成的Promise的结果。

例子:

javascript
let promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 500, 'one'); }); let promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'two'); }); Promise.race([promise1, promise2]).then(value => { console.log(value); // "two" - 第一个解决的Promise });

总结

  • 使用Promise.all()当你需要所有的异步操作都成功完成。
  • 使用Promise.allSettled()来处理所有的Promise完成后的结果,不管它们是否成功。
  • 使用Promise.race()来得到最快的一个结果,不管是成功还是失败。

这些方法提供了不同场景下处理多个Promise的灵活性。

2024年6月29日 12:07 回复

你的答案