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);
}
}

👉 逻辑顺序 = 代码顺序

作者 admin

百度广告效果展示