在JavaScript中,如果需要等待多个Promise完成,主要有几种方法可以实现:
1. Promise.all()
这是最常用的方法之一,特别适用于当所有的异步操作都必须成功执行,才能继续执行接下来的操作。Promise.all()
接受一个Promise对象的数组作为参数,当所有的Promise对象都成功完成时,它返回一个新的Promise对象。这个新的Promise将会异步完成,并且它的结果是一个包含所有传入Promise结果的数组。
例子:
javascriptlet 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的结果,无论是成功还是失败。
例子:
javascriptlet 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的结果。
例子:
javascriptlet 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 回复