面向初学者的 JavaScript Promise 解释

发布: (2026年4月4日 GMT+8 13:46)
3 分钟阅读
原文: Dev.to

Source: Dev.to

🧠 Promise 解决了什么问题?

在 Promise 之前,我们使用 回调函数 来处理异步任务:

fetchData(function (data) {
  processData(data, function (result) {
    console.log(result);
  });
});

❌ 回调地狱 → 难以阅读,难以维护

Promise 就像一个占位符,用于表示可能尚未可用的值。

⏳ Promise 状态

Promise 可以处于 三种状态

  1. Pending(待定) – 初始状态,等待结果
  2. Fulfilled(已完成) – 操作成功,值可用
  3. Rejected(已拒绝) – 操作失败,错误可用
Pending → Fulfilled or Rejected

⚙️ 基本 Promise 生命周期

const promise = new Promise((resolve, reject) => {
  const success = true;
  if (success) {
    resolve("Task completed");
  } else {
    reject("Task failed");
  }
});

promise
  .then(result => console.log(result)) // handles success
  .catch(error => console.log(error)); // handles failure

success = true 时的输出

Task completed

success = false 时的输出

Task failed

🔄 Promise 链式调用

Promise 可以链式调用,以 顺序 运行多个异步任务:

fetchData()
  .then(data => processData(data))
  .then(result => console.log(result))
  .catch(err => console.error(err));
  • 比嵌套回调更简洁
  • 更易阅读和维护

📊 回调 vs Promise

特性回调Promise
可读性低(嵌套)高(线性)
错误处理困难容易(catch
异步流程嵌套链式
未来值

🛠️ 实际案例

function fetchUser(userId) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (userId === 1) {
        resolve({ id: 1, name: "Rahul" });
      } else {
        reject("User not found");
      }
    }, 1000);
  });
}

fetchUser(1)
  .then(user => console.log(user.name)) // Rahul
  .catch(err => console.log(err));

🧩 可视化 Promise 生命周期

Promise created → pending

(resolve) fulfilled → .then runs
(reject)  rejected → .catch runs

🧠 关键要点

  • Promise 代表未来的一个值
  • 它们防止回调地狱
  • .then() 处理成功,.catch() 处理错误。
  • Promise 可以链式用于顺序的异步操作。

🚀 最后思考

Promise 是现代异步 JavaScript 的基础。一旦掌握它们,你就可以准备好:

  • async/await 语法
  • 复杂的异步工作流
  • 干净、可读、可维护的代码
0 浏览
Back to Blog

相关文章

阅读更多 »

理解 JavaScript 中的 this 关键字

JavaScript 有一个特殊关键字叫 **this**,常常让初学者感到困惑。关键概念是:**this** 指向调用函数的 **object**。**this** 在…

同步 vs 异步 JavaScript

JavaScript 是单线程的,但它可以通过同步和异步行为高效地处理多个任务。什么是同步代码?同步…

执行上下文

想象 Execution Context 像一个厨房。在你开始烹饪(执行代码)之前,你需要工作空间、变量工具和函数配方。