promise的方法总结

722 阅读3分钟

Promise 是 JavaScript 中用于处理异步操作的对象。它表示一个异步操作的最终完成(或失败)及其结果值。Promise 提供了一种更优雅的方式来处理异步代码,避免了传统的回调地狱(Callback Hell)。


Promise 的三种状态

  1. Pending(等待中)
    • 初始状态,既没有被兑现(fulfilled),也没有被拒绝(rejected)。
  2. Fulfilled(已兑现)
    • 表示操作成功完成,此时会调用 then 方法中的成功回调。
  3. Rejected(已拒绝)
    • 表示操作失败,此时会调用 then 方法中的失败回调或 catch 方法。

创建 Promise

Promise 的构造函数接受一个函数(通常称为执行器函数),该函数有两个参数:resolvereject

  • resolve:将 Promise 的状态从 pending 变为 fulfilled,并传递结果值。
  • reject:将 Promise 的状态从 pending 变为 rejected,并传递错误原因。

示例:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const success = true;
    if (success) {
      resolve("Operation succeeded!");
    } else {
      reject("Operation failed!");
    }
  }, 1000);
});

promise
  .then((result) => console.log(result)) // 输出 "Operation succeeded!"
  .catch((error) => console.error(error));

Promise 的链式调用

Promise 支持链式调用,可以通过 then 方法依次处理多个异步操作。

示例:

const fetchData = () => {
  return new Promise((resolve) => {
    setTimeout(() => resolve("Data fetched!"), 1000);
  });
};

const processData = (data) => {
  return new Promise((resolve) => {
    setTimeout(() => resolve(`${data} -> Processed!`), 1000);
  });
};

fetchData()
  .then((data) => processData(data))
  .then((result) => console.log(result)) // 输出 "Data fetched! -> Processed!"
  .catch((error) => console.error(error));

Promise 的静态方法

  1. Promise.resolve()

    • 返回一个已经成功(fulfilled)的 Promise 对象。

    • 示例:

      Promise.resolve("Resolved!").then((result) => console.log(result)); // 输出 "Resolved!"
      
  2. Promise.reject()

    • 返回一个已经失败(rejected)的 Promise 对象。

    • 示例:

      Promise.reject("Rejected!").catch((error) => console.error(error)); // 输出 "Rejected!"
      
  3. Promise.all()

    • 接收一个 Promise 数组,当所有 Promise 都成功时返回一个包含所有结果的数组;如果任何一个 Promise 失败,则立即返回失败的结果。

    • 示例:

      const promises = [
        Promise.resolve(1),
        Promise.resolve(2),
        Promise.resolve(3),
      ];
      
      Promise.all(promises)
        .then((results) => console.log(results)) // 输出 [1, 2, 3]
        .catch((error) => console.error(error));
      
  4. Promise.race()

    • 接收一个 Promise 数组,返回第一个完成(无论成功或失败)的 Promise 的结果。

    • 示例:

      const promises = [
        new Promise((resolve) => setTimeout(() => resolve("First"), 1000)),
        new Promise((resolve) => setTimeout(() => resolve("Second"), 2000)),
      ];
      
      Promise.race(promises).then((result) => console.log(result)); // 输出 "First"
      
  5. Promise.allSettled()

    • 接收一个 Promise 数组,等待所有 Promise 完成(无论成功或失败),并返回一个包含每个 Promise 结果的对象数组。

    • 示例:

      const promises = [
        Promise.resolve(1),
        Promise.reject("Error"),
        Promise.resolve(3),
      ];
      
      Promise.allSettled(promises).then((results) => console.log(results));
      // 输出:
      // [
      //   { status: 'fulfilled', value: 1 },
      //   { status: 'rejected', reason: 'Error' },
      //   { status: 'fulfilled', value: 3 }
      // ]
      
  6. Promise.any()

    • 接收一个 Promise 数组,返回第一个成功的 Promise 的结果。如果所有 Promise 都失败,则返回一个 AggregateError

    • 示例:

      const promises = [
        Promise.reject("Error 1"),
        Promise.resolve("Success!"),
        Promise.reject("Error 2"),
      ];
      
      Promise.any(promises)
        .then((result) => console.log(result)) // 输出 "Success!"
        .catch((error) => console.error(error));
      

Promise 的实例方法

  1. then()

    • 用于为 Promise 添加成功(fulfilled)或失败(rejected)状态的回调函数。

    • 示例:

      promise.then(
        (result) => console.log(result), // 成功回调
        (error) => console.error(error)  // 失败回调
      );
      
  2. catch()

    • 用于捕获 Promise 的失败状态(rejected)。

    • 示例:

      promise.catch((error) => console.error(error));
      
  3. finally()

    • 无论 Promise 是成功还是失败,都会执行的回调函数。

    • 示例:

      promise.finally(() => console.log("Done!"));
      

总结

方法类型方法名描述
实例方法then()添加成功或失败的回调函数
实例方法catch()捕获失败状态
实例方法finally()无论成功或失败都会执行的回调函数
静态方法Promise.resolve()返回一个成功的 Promise
静态方法Promise.reject()返回一个失败的 Promise
静态方法Promise.all()等待所有 Promise 成功,或第一个失败
静态方法Promise.allSettled()等待所有 Promise 完成(无论成功或失败)
静态方法Promise.race()返回第一个完成的 Promise(无论成功或失败)
静态方法Promise.any()返回第一个成功的 Promise,如果全部失败则返回 AggregateError

Promise 是 JavaScript 中处理异步操作的核心工具。它通过链式调用和状态管理,使得异步代码更易读、更易维护。结合 async/await 语法,可以进一步简化异步代码的编写。