Promise.allSettled, Promise.all, Promise.race, Promise.any:一次掌握所有

作者:暴富20212024.02.16 23:04浏览量:7

简介:本文将详细介绍JavaScript中的Promise.allSettled、Promise.all、Promise.race和Promise.any四个方法,通过对比它们的异同,帮助读者更好地理解和应用这些方法。

在JavaScript中,Promise是一种用于处理异步操作的对象。它提供了一种简洁的方式来处理异步操作的结果。Promise有许多实用的方法,包括:Promise.allSettled、Promise.all、Promise.race和Promise.any。下面我们将一一探讨它们的用法和特点。

一、Promise.allSettled

Promise.allSettled是一个相对较新的方法,它接受一个Promise对象的数组作为参数,并返回一个新的Promise。这个新的Promise将在所有输入的Promise都已解决或拒绝后解析,返回一个包含所有输入Promise结果的数组。

示例:

  1. const promise1 = Promise.resolve(3);
  2. const promise2 = Promise.reject(new Error('error'));
  3. const promise3 = new Promise((resolve, reject) => { setTimeout(() => resolve(5), 1000); });
  4. Promise.allSettled([promise1, promise2, promise3]).then(([result1, result2, result3]) => {
  5. console.log(result1.status, result1.value); // 成功 3
  6. console.log(result2.status, result2.reason); // 失败 Error('error')
  7. console.log(result3.status, result3.value); // 成功 5
  8. });

在上面的例子中,我们创建了三个不同的Promise,然后使用Promise.allSettled将它们包装在一起。结果是一个新的Promise,它会在所有输入的Promise都已解决或拒绝后解析,并返回一个包含所有输入Promise结果的数组。

二、Promise.all

Promise.all是另一个常用的方法,它接受一个Promise对象的数组作为参数,并返回一个新的Promise。这个新的Promise将在所有输入的Promise都成功解析后解析,返回一个包含所有输入Promise结果的数组。如果任何一个输入的Promise被拒绝,新的Promise将被拒绝。

示例:

  1. const promise1 = Promise.resolve(3);
  2. const promise2 = Promise.resolve(4);
  3. const promise3 = Promise.resolve(5);
  4. Promise.all([promise1, promise2, promise3]).then(([result1, result2, result3]) => {
  5. console.log(result1); // 3
  6. console.log(result2); // 4
  7. console.log(result3); // 5
  8. });

在上面的例子中,我们创建了三个不同的Promise,然后使用Promise.all将它们包装在一起。结果是一个新的Promise,它会在所有输入的Promise都成功解析后解析,并返回一个包含所有输入Promise结果的数组。如果任何一个输入的Promise被拒绝,新的Promise将被拒绝。

三、Promise.race

Promise.race也是一个常用的方法,它接受一个Promise对象的数组作为参数,并返回一个新的Promise。这个新的Promise将在任何一个输入的Promise成功解析或被拒绝后解析或被拒绝。也就是说,无论其他输入的Promise的状态如何,只要有一个输入的Promise最先解析或被拒绝,新的Promise就会以同样的状态解析或被拒绝。

示例:

```javascript
const promise1 = new Promise((resolve, reject) => { setTimeout(() => resolve(‘success’), 2000); });
const promise2 = new Promise((resolve, reject) => { setTimeout(() => resolve(‘failure’), 1000); });
const promise3 = new Promise((resolve, reject) => { setTimeout(() => reject(‘error’), 3000); });

Promise.race([promise1, promise2, promise3]).then(result => console.log(result)); // 运行结果可能是 ‘success’ 或 ‘failure’
```在上面的例子中,我们创建了三个不同的Promise,然后使用Promise.race将它们包装在一起。结果是一个新的Promise,它会在任何一个输入的Promise最先解析或被拒绝后解析或被拒绝。也就是说,无论其他输入的Promise的状态如何,只要有一个输入的Promise最先解析或被拒绝,新的Promise就会以同样的状态解析或被拒绝。运行结果可能是 ‘success’ 或 ‘failure’
四、总结:选择合适的方法至关重要
以上就是JavaScript中的四个与Prom