Promise对象

25 阅读3分钟

当一个函数返回一个 Promise 时,它的潜台词是:

“我现在还没做完,但我给你一张‘提货单(收据)’。你可以先去忙别的,等我做完了,我会通过这张单子通知你结果(或者告诉你失败了)。”

在编程(特别是 JavaScript/TypeScript)中,这意味着这个操作是**异步(Asynchronous)**的。


1. 生活中的通俗类比:餐厅点餐 🍔

想象你去麦当劳点餐:

  1. 点餐(调用函数): 你对服务员说“我要一个巨无霸套餐”。
  2. 拿到小票(返回 Promise): 服务员立刻给了你一张小票(这就是 Promise 对象)。这时候汉堡还没做好,但你手里握着这张小票,代表“未来你会得到这个汉堡”的承诺
  3. 去做别的事(非阻塞): 你不需要傻站在柜台前盯着服务员做汉堡,你可以去刷手机、找座位(代码继续往下执行,不卡顿)。
  4. 叫号取餐(Promise 兑现/Resolve): 几分钟后,屏幕显示你的号码。你拿着小票去换到了汉堡。
  5. 或者发生意外(Promise 拒绝/Reject): 服务员告诉你“面包机坏了,做不了”。这就是任务失败。

2. 技术层面的含义

当你在代码里看到一个函数返回 Promise<string>Promise<User> 时,这说明:

  1. 耗时操作: 这个函数内部可能在干一些比较慢的事情,比如:

    • 去数据库查数据(网络/磁盘IO)。
    • 去请求第三方的 API。
    • 读写文件。
  2. 不会卡死程序: 为了不让整个程序停下来等它,它选择先返回一个 Promise 对象,让后面的代码先跑起来。

3. Promise 的三种状态

你拿到手的这个 Promise 对象,一定处于以下三种状态之一:

  • Pending (进行中): 还在努力干活中(汉堡还在做)。
  • Resolved / Fulfilled (已完成): 成功了,结果放在 Promise 里给你(拿到汉堡)。
  • Rejected (已拒绝): 失败了,会抛出一个错误原因(没面包了)。

4. 你该怎么使用它?

既然函数返回了 Promise,你就不能直接当做结果用。你需要“拆开”这个 Promise。

方式一:现代写法 (推荐) - async / await

这是最像“同步代码”的写法。

// 假设 fetchUser 是一个返回 Promise 的函数
async function main() {
  console.log('开始点餐...');

  // 🌟 await 的意思就是:
  // “在这里暂停一下,直到 Promise 变成 Resolved(成功),把结果拿出来赋值给 user”
  const user = await fetchUser(); 
  
  // 只有等拿到 user 后,才会执行这行
  console.log('拿到了用户名字:', user.name);
}

方式二:传统写法 - .then()

这是比较老的写法,通过回调函数处理结果。

console.log('开始点餐...');

fetchUser().then((user) => {
  // 🌟 当 Promise 成功后,自动执行这里的代码
  console.log('拿到了用户名字:', user.name);
}).catch((error) => {
  // 🌟 失败了走这里
  console.error('出错了:', error);
});

console.log('我可以先去刷手机...'); // 这行代码通常会在 user 打印之前就执行!


总结

  • 返回 Promise = 返回一个“未来的结果”
  • 目的 = 为了不阻塞主线程,让耗时的操作在后台跑。
  • 如何拿到真实数据 = 必须使用 await 关键字或者 .then() 方法。