当一个函数返回一个 Promise 时,它的潜台词是:
“我现在还没做完,但我给你一张‘提货单(收据)’。你可以先去忙别的,等我做完了,我会通过这张单子通知你结果(或者告诉你失败了)。”
在编程(特别是 JavaScript/TypeScript)中,这意味着这个操作是**异步(Asynchronous)**的。
1. 生活中的通俗类比:餐厅点餐 🍔
想象你去麦当劳点餐:
- 点餐(调用函数): 你对服务员说“我要一个巨无霸套餐”。
- 拿到小票(返回 Promise): 服务员立刻给了你一张小票(这就是 Promise 对象)。这时候汉堡还没做好,但你手里握着这张小票,代表“未来你会得到这个汉堡”的承诺。
- 去做别的事(非阻塞): 你不需要傻站在柜台前盯着服务员做汉堡,你可以去刷手机、找座位(代码继续往下执行,不卡顿)。
- 叫号取餐(Promise 兑现/Resolve): 几分钟后,屏幕显示你的号码。你拿着小票去换到了汉堡。
- 或者发生意外(Promise 拒绝/Reject): 服务员告诉你“面包机坏了,做不了”。这就是任务失败。
2. 技术层面的含义
当你在代码里看到一个函数返回 Promise<string> 或 Promise<User> 时,这说明:
-
耗时操作: 这个函数内部可能在干一些比较慢的事情,比如:
- 去数据库查数据(网络/磁盘IO)。
- 去请求第三方的 API。
- 读写文件。
-
不会卡死程序: 为了不让整个程序停下来等它,它选择先返回一个 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()方法。