理解 JavaScript 中的 Promise

2023-11-29 00:01:54 浏览数 (1)

Absolutely! Here's the translation of the provided blog post:


JavaScript 中的 Promise 是处理异步操作的强大功能。它们提供了一种更有组织性和可读性的方式来处理异步操作的结果或错误。在本博文中,我们将探讨三种常用的 Promise 方法:

  1. Promise.all
  2. Promise.allSettled
  3. Promise.race

Promise.all

Promise.all 是一个方法,它接受一个 Promise 可迭代对象作为输入,并返回一个单一的 Promise。返回的 Promise 会被解决为输入 Promise 的解决值数组,顺序与输入的 Promise 一致。如果任何一个输入的 Promise 被拒绝,整个 Promise.all 将会被拒绝,拒因为第一个被拒绝的 Promise 的原因。

这是一个简单的示例:

代码语言:javascript复制
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.reject(new Error('Failed'));

Promise.all([promise1, promise2, promise3])
  .then(values => console.log(values))
  .catch(error => console.error(error.message));
// 输出: Error: Failed

在这个例子中,由于 promise3 被拒绝,整个 Promise.all 被拒绝,触发了 catch 块。

Promise.allSettled

Promise.allSettled 类似于 Promise.all,但有一个关键的区别。它返回一个 Promise,该 Promise 会被解决为每个输入 Promise 的结果对象数组。每个结果对象都有一个状态属性,可以是 "fulfilled" 或 "rejected"。这样,即使某些 Promise 失败,其他的仍会被处理,您可以独立地处理每个 Promise 的成功或失败。

这是一个例子:

代码语言:javascript复制
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.reject(new Error('Failed'));

Promise.allSettled([promise1, promise2, promise3])
  .then(results => results.forEach(result => {
    if (result.status === 'fulfilled') {
      console.log(result.value);
    } else {
      console.error(result.reason.message);
    }
  }));
// 输出: 1, 2, Error: Failed

在这个例子中,即使 promise3 被拒绝,Promise.allSettled 仍然继续处理其他 Promise,您可以单独处理它们的成功或失败。

Promise.race

Promise.race 是另一个方法,它接受一个 Promise 可迭代对象,并返回一个 Promise,该 Promise 被解决为第一个被解决的 Promise 的值或原因(解决或拒绝)。当您对第一个被解决的 Promise 的结果感兴趣时,它会很有用。

这是一个例子:

代码语言:javascript复制
const promise1 = new Promise(resolve => setTimeout(() => resolve('Promise 1'), 1000));
const promise2 = new Promise(resolve => setTimeout(() => resolve('Promise 2'), 500));

Promise.race([promise1, promise2])
  .then(value => console.log(value))
  .catch(error => console.error(error.message));
// 输出: Promise 2

在这个例子中,由于 promise2 比 promise1 更快被解决,整个 Promise.race 被解决为 promise2 的值。

结论

总而言之,当您希望所有 Promise 被解决时,但如果其中任何一个失败,则整个操作失败时,可以使用 Promise.all。当您希望独立处理每个 Promise 的解决或拒绝,确保一个失败的 Promise 不会阻止其他 Promise 被处理时,可以使用 Promise.allSettled。当您对第一个被解决的 Promise 的结果感兴趣时,可以使用 Promise.race。

每种方法都有其适用场景,了解它们的差异可以让您为特定情况选择最合适的方法。无论您需要所有 Promise 成功,想要独立处理成功和失败,还是对第一个被解决的 Promise 感兴趣,JavaScript 的 Promise 方法都提供了处理异步操作的灵活工具。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞