JavaScript中promise.all和promise.race的区别?

Promise.allPromise.race 都是 JavaScript 中 Promise 对象的静态方法,它们用于处理多个 Promise 对象,但它们的行为和用途有所不同。

Promise.all

Promise.all 接收一个由 Promise 对象组成的数组(或类数组对象),并返回一个新的 Promise。这个新的 Promise 会在所有输入的 Promise 都完成时才完成,并将其结果作为一个数组传递给 then 方法。如果输入的 Promise 数组中有一个 Promise 被拒绝,则返回的新的 Promise 也会立即被拒绝,并将其拒绝原因传递给 catch 方法。

示例:

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));
const promise3 = fetch('https://api.github.com/users/github').then(response => response.json());

Promise.all([promise1, promise2, promise3]).then(values => {
  console.log(values); // 所有 Promise 完成后,输出 [3, 'foo', 用户数据]
}).catch(error => {
  console.error(error); // 如果有 Promise 被拒绝,输出拒绝原因
});

Promise.race

Promise.race 同样接收一个由 Promise 对象组成的数组(或类数组对象),并返回一个新的 Promise。这个新的 Promise 会在输入的 Promise 数组中任意一个 Promise 完成或失败时立即完成或失败,并将其结果或拒绝原因传递给 thencatch 方法。

示例:

const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'one'));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'two'));

Promise.race([promise1, promise2]).then(value => {
  console.log(value); // 输出 'two',因为 promise2 更快完成
}).catch(error => {
  console.error(error); // 如果有 Promise 被拒绝,输出拒绝原因
});

区别总结

  • Promise.all 等待所有 Promise 都完成,并返回一个包含所有结果的数组。如果任何一个 Promise 被拒绝,整个 Promise.all 也会被拒绝。
  • Promise.race 只等待第一个完成或失败的 Promise,并将其结果或拒绝原因作为自己的结果或拒绝原因。

在实际应用中,Promise.all 通常用于需要所有异步操作都完成才能进行下一步的情况,而 Promise.race 则用于检测哪个异步操作最快完成或失败。

您可能还喜欢...

发表评论

您的电子邮箱地址不会被公开。