javascript_什么是Promise及其用法

Promise是处理异步操作的对象,解决回调地狱问题。它有pending、fulfilled和rejected三种状态,状态一旦改变不可逆。通过new Promise()创建,接收resolve和reject参数控制状态。使用then()处理成功,catch()处理失败,finally()执行最终操作。支持链式调用,实现异步流程控制,如fetch后连续then。提供静态方法:Promise.resolve()、Promise.reject()、Promise.all()(全成功才成功)、Promise.race()(首个完成即返回)。Promise使异步代码更清晰,为async/await奠定基础,是现代JavaScript开发的核心特性之一。

Promise 是 JavaScript 中用于处理异步操作的一种对象,它代表一个目前还不可用,但在未来某个时刻会完成的操作。Promise 可以解决传统回调函数嵌套过深(“回调地狱”)的问题,让异步代码更清晰、更易维护。

Promise 的三种状态

Promise 对象有三种状态:

  • pending(等待中):初始状态,既没有被完成也没有被拒绝。
  • fulfilled(已完成):异步操作成功完成。
  • rejected(已拒绝):异步操作失败。

一旦状态从 pending 变为 fulfilled 或 rejected,就不会再改变。

创建和使用 Promise

使用 new Promise() 构造函数来创建一个 Promise 实例。构造函数接收一个执行函数,该函数有两个参数:resolvereject,分别用来改变 Promise 的状态。

const myPromise = new Promise((resolve, reject) => {
  // 模拟异步操作
  setTimeout(() => {
    const success = true;
    if (success) {
      resolve("操作成功!");
    } else {
      reject("操作失败!");
    }
  }, 1000);
});

通过 then 方法处理成功结果,用 catch 处理失败结果,还可以用 finally 执行无论成功或失败都运行的代码。

myPromise
  .then(result => {
    console.log(result); // 输出: 操作成功!
  })
  .catch(error => {
    console.log(error);
  })
  .finally(() => {
    console.log("请求结束");
  });

链式调用与异步流程控制

Promise 支持链式调用,每个 then 返回一个新的 Promise,可以实现多个异步操作依次执行。

fetchUserData()
  .then(userData => getUserOrders(userData.id))
  .then(orders => processOrders(orders))
  .then(result => {
    console.log("处理完成:", result);
  })
  .catch(err => {
    console.error("出错:", err);
  });

这种结构比层层嵌套的回调函数清晰得多。

常见的 Promise 静态方法

  • Promise.resolve(value):返回一个以给定值解析后的 Promise 对象。
  • Promise.reject(reason):返回一个以给定原因拒绝的 Promise。
  • Promise.all(iterable):当所有 Promise 都成功时返回成功;只要有一个失败就进入 catch。
  • Promise.race(iterable):返回第一个完成(无论成功或失败)的 Promise 结果。
Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log("全部完成:", results);
  })
  .catch(err => {
    console.log("至少一个失败:", err);
  });

基本上就这些。Promise 让异步编程变得更可控,也为后续 async/await 语法打下基础。掌握它对现代 JavaScript 开发至关重要。