JavaScript 教程:深入理解 Promise API 的 6 个静态方法

JavaScript 教程:深入理解 Promise API 的 6 个静态方法

【免费下载链接】en.javascript.info Modern JavaScript Tutorial 【免费下载链接】en.javascript.info 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info

前言

在现代 JavaScript 开发中,Promise 已经成为处理异步操作的核心工具。Promise API 提供了 6 个非常实用的静态方法,它们可以帮助我们优雅地处理各种异步场景。本文将深入讲解这些方法的使用场景和区别。

1. Promise.all:并行执行多个 Promise

Promise.all 是最常用的方法之一,它允许我们并行执行多个 Promise,并等待所有 Promise 都完成。

基本用法

let promise = Promise.all([promise1, promise2, promise3]);

特点

  • 当所有 Promise 都成功解决时,返回一个包含所有结果的数组
  • 结果的顺序与传入的 Promise 顺序一致
  • 如果任何一个 Promise 被拒绝,整个 Promise.all 会立即被拒绝

实际应用示例

假设我们需要同时获取多个用户的信息:

let userIds = [1, 2, 3];
let userPromises = userIds.map(id => fetch(`/api/users/${id}`));

Promise.all(userPromises)
  .then(responses => Promise.all(responses.map(r => r.json())))
  .then(users => {
    // 处理所有用户数据
  })
  .catch(error => {
    // 处理错误
  });

2. Promise.allSettled:获取所有 Promise 的最终状态

Promise.allSettled 是 ES2020 新增的方法,它不会因为某个 Promise 被拒绝而中断。

基本用法

let promise = Promise.allSettled([promise1, promise2]);

特点

  • 等待所有 Promise 完成(无论成功或失败)
  • 返回一个对象数组,每个对象包含:
    • status: "fulfilled" 或 "rejected"
    • value(如果成功)或 reason(如果失败)

实际应用示例

Promise.allSettled([
  fetch('/api/user'),
  fetch('/api/products'),
  fetch('/invalid-url')
]).then(results => {
  results.forEach(result => {
    if (result.status === 'fulfilled') {
      console.log('成功:', result.value);
    } else {
      console.log('失败:', result.reason);
    }
  });
});

3. Promise.race:竞速模式

Promise.race 返回第一个完成的 Promise(无论成功或失败)。

基本用法

let promise = Promise.race([promise1, promise2]);

特点

  • 返回第一个完成的 Promise 的结果
  • 其他 Promise 的结果会被忽略
  • 常用于设置超时机制

实际应用示例

// 设置请求超时
let fetchPromise = fetch('/api/data');
let timeoutPromise = new Promise((_, reject) => 
  setTimeout(() => reject(new Error('请求超时')), 5000)
);

Promise.race([fetchPromise, timeoutPromise])
  .then(data => console.log(data))
  .catch(error => console.error(error));

4. Promise.any:获取第一个成功的 Promise

Promise.any 是 ES2021 新增的方法,它返回第一个成功解决的 Promise。

基本用法

let promise = Promise.any([promise1, promise2]);

特点

  • 忽略所有被拒绝的 Promise,直到第一个成功的 Promise
  • 如果所有 Promise 都被拒绝,返回一个 AggregateError
  • 适用于需要从多个备用源获取数据的场景

实际应用示例

Promise.any([
  fetch('https://source1.com/data'),
  fetch('https://source2.com/data'),
  fetch('https://source3.com/data')
]).then(data => {
  // 使用第一个成功的响应
}).catch(error => {
  // 所有请求都失败了
  console.error(error.errors); // 查看所有错误
});

5. Promise.resolve 和 Promise.reject

这两个方法用于创建已解决或已拒绝的 Promise。

Promise.resolve

// 创建一个已解决的 Promise
let resolvedPromise = Promise.resolve('成功值');

// 等同于
let resolvedPromise = new Promise(resolve => resolve('成功值'));

Promise.reject

// 创建一个已拒绝的 Promise
let rejectedPromise = Promise.reject(new Error('失败原因'));

// 等同于
let rejectedPromise = new Promise((_, reject) => reject(new Error('失败原因')));

使用场景

  • 确保函数总是返回 Promise
  • 在测试中创建模拟的 Promise
  • 将同步值转换为 Promise

方法对比总结

方法描述成功条件失败条件
Promise.all所有 Promise 都成功返回结果数组任一失败立即拒绝
Promise.allSettled所有 Promise 都完成(无论成功或失败)返回状态对象数组不会拒绝
Promise.race第一个完成的 Promise(无论成功或失败)返回第一个结果返回第一个错误
Promise.any第一个成功的 Promise返回第一个成功结果所有都失败才拒绝
Promise.resolve创建一个已解决的 Promise总是成功不适用
Promise.reject创建一个已拒绝的 Promise不适用总是失败

最佳实践建议

  1. 数据并行获取:使用 Promise.all 同时获取多个不相关的数据
  2. 容错处理:使用 Promise.allSettled 当需要知道每个 Promise 的最终状态
  3. 超时控制:使用 Promise.race 实现请求超时机制
  4. 备用数据源:使用 Promise.any 从多个备用源获取数据
  5. API 兼容:使用 Promise.resolve 确保函数总是返回 Promise

理解这些 Promise 静态方法的区别和适用场景,将帮助你编写更健壮、更高效的异步 JavaScript 代码。

【免费下载链接】en.javascript.info Modern JavaScript Tutorial 【免费下载链接】en.javascript.info 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值