JavaScript中的Promise是什么_如何处理异步操作

Promise是JavaScript处理异步操作的标准对象,代表未来可能完成或失败的操作,具有pending、fulfilled、rejected三种不可逆状态,支持链式调用、错误捕获及all/race/allSettled等组合方法。

Promise 是 JavaScript 中处理异步操作的标准化对象,它代表一个**尚未完成但未来可能完成或失败的操作**,并提供统一的方式链式响应结果或错误。

Promise 的三种状态

每个 Promise 实例始终处于以下一种状态:

  • pending(等待中):初始状态,既未成功也未失败
  • fulfilled(已成功):操作完成,调用 .then() 获取返回值
  • rejected(已失败):操作出错,调用 .catch().then(null, handler) 捕获错误

状态一旦改变(pending → fulfilled 或 pending → rejected),就不可逆,也不会再变。

创建和使用 Promise

new Promise() 构造器创建,接收一个执行器函数(executor),该函数立即执行,并传入两个参数:resolvereject

const fetchData = new Promise((resolve, reject) => {
  setTimeout(() => {
    const success = Math.random() > 0.3;
    if (success) {
      resolve("数据加载成功");
    } else {
      reject(new Error("网络请求失败"));
    }
  }, 1000);
});

后续通过 .then() 处理成功结果,.catch() 处理错误:

fetchData
  .then(data => console.log(data))
  .catch(err => console.error(err.message));

链式调用与 Promise 组合

Promise 的核心优势在于可链式调用,每个 .then().catch() 都返回一个新的 Promise,支持顺序异步流程:

  • .then() 中返回普通值 → 下一个 .then() 接收该值
  • .then() 中返回新 Promise → 下一个 .then() 等待其完成后再执行
  • .catch() 会捕获前面所有环节抛出的错误(包括同步异常和 Promise rejection)

常见组合方法:

  • Promise.all([p1, p2, p3]):全部成功才 resolve,任一失败则 reject
  • Promise.race([p1, p2, p3]):哪个最先 settle(fulfill/reject),就以它的结果为准
  • Promise.allSettled([p1, p2]):等待全部结束,返回每个 Promise 的最终状态对象

对比回调函数与 async/await

相比传统回调(易导致“回调地狱”),Promise 显著提升可读性和错误处理能力;而 async/await 是 Promise 的语法糖,让异步代码写起来像同步:

async function loadUser() {
  try {
    const res = await fetch('/api/user');
    const user = await res.json();
    return user;
  } catch (err) {
    console.error('加载用户失败:', err);
  }
}

注意:await 只能在 async 函数内使用,且后面必须是 Promise(或可转为 Promise 的值)。