当前位置: 首页 > article >正文

深入理解 JavaScript 的 Promise:实例方法与静态方法

在 JavaScript 中,Promise 是处理异步操作的核心工具,它提供了方便的接口来管理异步任务的执行顺序。本文将介绍 Promise 的实例方法和静态方法,帮助你更好地理解和使用它。

一、Promise 的实例方法

Promise 的实例方法主要用于处理单个 Promise 实例的结果。这些方法帮助你在 Promise 完成后做进一步的操作。

1. then()

then() 方法是 Promise 的核心方法之一,它接受两个参数:一个用于处理成功结果的回调函数,一个用于处理错误的回调函数。then() 返回一个新的 Promise,因此可以链式调用。

let promise = new Promise((resolve, reject) => {
  let success = true;
  if (success) {
    resolve("Operation successful");
  } else {
    reject("Operation failed");
  }
});

promise
  .then(result => {
    console.log(result); // "Operation successful"
  })
  .catch(error => {
    console.log(error); // 不会执行
  });
2. catch()

catch() 方法用于捕获 Promise 中发生的任何错误,它的作用相当于 .then(null, errorHandler)catch() 方法也会返回一个新的 Promise,可以继续链式调用。

let promise = new Promise((resolve, reject) => {
  reject("An error occurred");
});

promise
  .catch(error => {
    console.log(error); // "An error occurred"
  });
3. finally()

finally() 方法在 Promise 完成时无论成功或失败都会执行。它通常用于清理操作,比如关闭加载指示器或重置状态。finally() 不会影响 Promise 的状态,且返回的 Promise 与原 Promise 的结果一致。

let promise = new Promise((resolve, reject) => {
  resolve("Operation complete");
});

promise
  .finally(() => {
    console.log("Cleanup actions here");
  })
  .then(result => {
    console.log(result); // "Operation complete"
  });

二、Promise 的静态方法

除了实例方法,Promise 还提供了许多静态方法,这些方法帮助你执行一些常见的异步操作模式。

1. Promise.resolve()

Promise.resolve() 方法用于返回一个已解决的 Promise 对象。如果传入一个值,它会被自动包裹成一个 Promise;如果传入的是一个已有的 Promise,则会直接返回它。

let resolvedPromise = Promise.resolve(42);
resolvedPromise.then(value => {
  console.log(value); // 42
});
2. Promise.reject()

Promise.reject() 方法用于返回一个已拒绝的 Promise 对象,通常用于创建一个失败的 Promise

let rejectedPromise = Promise.reject("Something went wrong");
rejectedPromise.catch(error => {
  console.log(error); // "Something went wrong"
});
3. Promise.all()

Promise.all() 方法接受一个包含多个 Promise 的数组,并返回一个新的 Promise,该 Promise 在所有输入的 Promise 都成功时被解决,并返回一个包含所有成功结果的数组。如果其中任何一个 Promise 被拒绝,Promise.all() 返回的 Promise 会立即被拒绝。

let promise1 = Promise.resolve(1);
let promise2 = Promise.resolve(2);
let promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3]).then(values => {
  console.log(values); // [1, 2, 3]
});

如果其中一个 Promise 失败,Promise.all() 会立即拒绝:

let promise1 = Promise.resolve(1);
let promise2 = Promise.reject("Error occurred");
let promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3])
  .then(values => {
    console.log(values);
  })
  .catch(error => {
    console.log(error); // "Error occurred"
  });
4. Promise.allSettled()

Promise.allSettled() 方法也接受一个包含多个 Promise 的数组,但与 Promise.all() 不同,它会等待所有的 Promise 完成,无论是成功还是失败。它返回一个包含每个 Promise 状态(成功或失败)和对应值(或错误)的数组。

let promise1 = Promise.resolve(1);
let promise2 = Promise.reject("Error occurred");
let promise3 = Promise.resolve(3);

Promise.allSettled([promise1, promise2, promise3]).then(results => {
  console.log(results);
  // [
  //   { status: 'fulfilled', value: 1 },
  //   { status: 'rejected', reason: 'Error occurred' },
  //   { status: 'fulfilled', value: 3 }
  // ]
});
5. Promise.race()

Promise.race() 方法接受一个包含多个 Promise 的数组,返回一个新的 Promise它会在第一个 Promise 完成时返回。无论该 Promise 是成功还是失败,Promise.race() 都会立即返回该结果。

let promise1 = new Promise(resolve => setTimeout(resolve, 100, "First"));
let promise2 = new Promise(resolve => setTimeout(resolve, 200, "Second"));

Promise.race([promise1, promise2]).then(result => {
  console.log(result); // "First"
});
6. Promise.any()

Promise.any() 方法与 Promise.race() 类似,唯一的不同是,它只会在至少一个 Promise 成功时返回。如果所有的 Promise 都失败,Promise.any() 会返回一个失败的 Promise

let promise1 = new Promise((_, reject) => setTimeout(reject, 100, "Error"));
let promise2 = new Promise(resolve => setTimeout(resolve, 200, "Success"));

Promise.any([promise1, promise2]).then(result => {
  console.log(result); // "Success"
}).catch(error => {
  console.log(error); // 如果所有 Promise 都失败,输出错误
});

三、总结

在 JavaScript 中,Promise 的实例方法和静态方法提供了强大的工具来管理异步任务。实例方法(如 then()catch()finally())允许我们对单个 Promise 实例的结果进行操作,而静态方法(如 Promise.resolve()Promise.all()Promise.race())则为常见的异步操作模式提供了方便的接口。掌握这些方法将帮助我们编写更高效、清晰和可维护的异步代码。


http://www.kler.cn/a/533282.html

相关文章:

  • 深度探索 C 语言操作符:从基础到实战应用
  • 计算机基础知识(第二篇)
  • WPS怎么使用latex公式?
  • C#属性和字段(访问修饰符)
  • 2023CCPC-Final A. Add One 2
  • JVM 四虚拟机栈
  • 无法连接到远程扩展主机服务器
  • 如何解决 Vue 应用中的内存泄漏
  • css 之 clip-path
  • 本地大模型编程实战(08)自制聊天机器人(2)
  • Java 常见的面试题(Hibernate)
  • 基于SpringBoot浪狼狗领养系统
  • C++多线程编程——call_once和单例模式
  • 【AI日记】25.02.05 自由不是一种工具
  • 2025年2月4日--2月9日(ue4.0shader抄写+ue5肉鸽独立游戏视频)
  • DeepSeek大模型介绍、本地化部署与使用!【AI大模型】
  • 数据库系统概念第六版记录 一
  • 【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)
  • 总结11..
  • Vue - customRef 自定义ref
  • shiro面试题
  • 【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现
  • Vue的状态管理:用响应式 API 做简单状态管理、状态管理库(Pinia )
  • 【论文精读】Taming Transformers for High-Resolution Image Synthesis
  • 【入门】如何使用DeepSeek批量创作短视频
  • git 指定ssh key