Promise 是“结果容器”,async / await 是“使用 Promise 的写法”
Promise 解决的是什么问题?
解决的是 “现在没有结果,但将来会有” 的问题。
典型场景:
- 网络请求
- 读文件
- 定时器
- api 接口
Promise 的三种状态(必须记)
- pending → 进行中
- fulfilled → 成功(resolve)
- rejected → 失败(reject)
一旦从 pending 变成 fulfilled / rejected,状态不可逆
一个最简单的 Promise
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(‘成功结果’);
}, 1000);
});
“我先给你一个承诺,1 秒后告诉你结果”
resolve / reject 是什么?
resolve(data) // 成功,交付结果
reject(err) // 失败,交付错误
它们的唯一作用:改变 Promise 状态 + 通知外部
怎么“用” Promise(then / catch)
then:拿成功结果
p.then(res => {
console.log(res);
});
catch:拿失败结果
p.catch(err => {
console.error(err);
});
链式调用(重点)
api1()
.then(res1 => api2(res1))
.then(res2 => api3(res2))
.catch(err => console.error(err));
这就是传说中的 “Promise 地狱”
async / await 是为了解决什么?
解决 then 链太长、太难读的问题
async 是什么(底层规则)
async function fn() {}
async 函数永远返回 Promise
async function fn() {
return 123;
}
等价于:
function fn() {
return Promise.resolve(123);
}
但注意一个关键点:123 是“已经存在的结果”
await 是什么(核心)
const result = await fn();
意思是:
暂停当前 async 函数
等 Promise 完成
拿到 resolve 的值
⚠️ await 只能写在 async 里
把 Promise 写成 async / await(对照)
Promise 写法
getUser()
.then(user => getOrders(user.id))
.then(list => console.log(list))
.catch(err => console.error(err));
async / await 写法(推荐)
async function loadData() {
try {
const user = await getUser();
const list = await getOrders(user.id);
console.log(list);
} catch (e) {
console.error(e);
}
}
👉 逻辑顺序 = 代码顺序