林林,这几个关键词其实是一个体系的,只是写法和用法不同,但底层都是 Promise 机制
我帮你按关系、执行顺序、语法糖的角度系统讲一下,你看完就能完全串起来。


1. Promise

Promise 是 ES6 提供的异步结果的容器,用来描述“一个值在未来才会可用”。
它有三种状态:

  • pending(进行中)
  • fulfilled(已完成,resolve)
  • rejected(已失败,reject)

创建方式:

let p = new Promise((resolve, reject) => {
  setTimeout(() => resolve("OK"), 1000);
});

2. .then()

.then() 用来注册当 Promise 完成(fulfilled)时的回调,也可以注册失败(rejected)的回调。

p.then(
  value => console.log("成功:", value),
  err => console.error("失败:", err)
);

特点:

  • .then() 不会阻塞,它会把回调放进微任务队列,等当前代码执行完再运行
  • .then() 总是返回一个新的 Promise,回调的返回值会作为下一个 .then() 的参数

例子:

Promise.resolve(1)
  .then(v => v + 1)    // 返回 2
  .then(v => v + 1)    // 返回 3
  .then(console.log);  // 打印 3

3. async

async 用在函数前面,让这个函数自动返回一个 Promise,即使你没有显式写 Promise。

async function foo() {
  return 42; // 实际等同于 Promise.resolve(42)
}

特点:

  • async 函数内部的返回值,会自动被 Promise.resolve 包装
  • 如果内部抛出错误,会自动变成 Promise 的 reject

4. await

await 只能用在 async 函数里,用来暂停代码执行,直到 Promise 完成,然后把结果赋给变量。

async function foo() {
  let result = await Promise.resolve(123);
  console.log(result); // 123
}

特点:

  • await 会暂停当前 async 函数后面的执行,等 Promise resolve 后继续
  • await 等到的是 .then() 的结果,所以本质是 .then() 的语法糖
  • 如果 Promise reject,会直接抛出异常(需要 try/catch 捕获)

5. 它们的联系

核心关系一句话:

Promise 是机制,.then 是注册回调的方法,async/await.then 的语法糖。

流程图:

Promise (异步结果容器)
   ↓
.then()   ← 注册 resolve/reject 回调,返回新 Promise
   ↓
async     ← 自动返回 Promise
   ↓
await     ← 暂停 async 函数,等待 Promise resolve,相当于 .then 的同步写法

例子(.then 写法):

fetch("/data")
  .then(res => res.json())
  .then(data => console.log(data))

等价的 async/await

async function getData() {
  const res = await fetch("/data");
  const data = await res.json();
  console.log(data);
}
getData();

6. 建议你记的关键点

  • Promise 只是一个结果的“承诺”,等到未来才兑现
  • .then 是注册兑现时要做的事(回调)
  • async 自动返回 Promise,让你不必手动 new Promise
  • await.then 的回调写成同步的形式,让代码更清晰

林林,如果你愿意,我可以帮你画一张 “Promise → then → async/await” 总关系图,把这几个概念用一个流程图全串起来,你一看就懂。
你要我画吗?这样你以后看异步逻辑就像读顺序代码一样轻松。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐