Promise

51 阅读2分钟

Promise是js中处理异步操作的核心解决方案,用于解决传统回调函数的“回调地狱”问题。它代表一个异步操作的最终完成(或失败)及其结果值。

一、Promise的三个状态

1.Pending(进行中)

初始状态,既未功也未失败

2.Fulfilled(已成功)

操作成功完成,调用resolve()

3.Rejected(已失败)

操作失败,调用reject()

状态一旦改变就变得不可逆(Pending->Fulfilled或Pending->Rejected)

二、基本用法

const promise = new Promise((resolve, reject) => {
  // 异步操作(如 API 请求、定时器等)
  if (/* 成功条件 */) {
    resolve("操作成功"); // 状态变为 Fulfilled
  } else {
    reject("操作失败"); // 状态变为 Rejected
  }
});

// 处理结果
promise
  .then(result => console.log(result)) // 成功时执行
  .catch(error => console.error(error)) // 失败时捕获
  .finally(() => console.log("无论成败都会执行"));

三、核心方法

方法作用链式调用
.then()处理成功状态可返回新的Promise
.catch()捕获错误可捕获链中任意错误
.finally()无论成功失败都执行不接受参数

四、静态方法

1.Promise.resolve()

快速创建成功状态的Promise

Promise.resolve("成功").then(console.log); // "成功"

2.Promise.reject()

快速创建失败状态的Promise

Promise.reject("失败").catch(console.error); // "失败"

3.Promise.all([p1,p2])

所有Promise成功才算成功

Promise.all([promise1, promise2])
  .then(results => console.log(results)) // [result1, result2]
  .catch(error => console.log("第一个失败的错误"));

4.Promise.race([p1,p2])

取得先完成的Promise结果(无论成败)

Promise.race([api1, api2])
  .then(firstResult => console.log(firstResult));

5.Promise.allSettled([p1,p2])

等待所有Promise完成(无论成败)

Promise.allSettled([p1, p2])
  .then(results => results.forEach(r => console.log(r.status)));

6.Promise.any([p1,p2])

取第一个成功的Promise

Promise.any([p1, p2])
  .then(firstSuccess => console.log(firstSuccess));

五、链式调用(解决回调地狱)

fetchData()
  .then(processData)
  .then(saveData)
  .then(result => {
    console.log("最终结果:", result);
  })
  .catch(error => {
    console.error("链中任意错误:", error);
  });

六、错误处理要点

1.隐式捕获

Promise会自动捕获同步错误

new Promise((resolve, reject) => {
  throw new Error("自动被 catch 捕获");
}).catch(console.error);

2.推荐写法

总是用.catch()结尾,避免未处理错误

七、Async/Await(基于Promise的语法糖)

async function fetchUser() {
  try {
    const user = await getUser(); // 等待 Promise 完成
    const posts = await getPosts(user.id);
    console.log(posts);
  } catch (error) {
    console.error("统一捕获错误", error);
  } finally {
    console.log("请求结束");
  }
}

代码更接近同步逻辑,错误处理更直观

八、常见误区

1.忘记return

.then(() => {
  newPromise(); // 错误!需 return
})

2.嵌套.then(重回回调地狱)

.then(a => {
  getB(a).then(b => { /* 避免这种嵌套 */ })
})

3.忽略catch(导致静默失败)