async/await和Promise的区别?

一、Promise 是什么

PromiseES6 提供的用于处理异步操作的对象

它有三种状态:

scss 复制代码
pending   (进行中)
fulfilled (成功)
rejected  (失败)

基本写法:

typescript 复制代码
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("成功")
  }, 1000)
})

promise
  .then(res => {
    console.log(res)
  })
  .catch(err => {
    console.log(err)
  })

特点:

  • 通过 .then() 处理成功
  • 通过 .catch() 处理错误
  • 可以 链式调用

二、async / await 是什么

async/awaitES2017 提出的异步写法,是基于 Promise 的语法糖。

特点:

  • async 声明函数为异步函数
  • await 等待 Promise 返回结果
  • 写起来像同步代码

例子:

javascript 复制代码
async function getData() {
  const res = await fetch("/api/data")
  const data = await res.json()
  console.log(data)
}

三、核心区别

对比点 Promise async/await
写法 链式调用 同步风格
可读性 一般 更好
错误处理 .catch() try...catch
调试 不太友好 更像同步代码
本质 原生异步对象 Promise 的语法糖

四、代码对比

Promise 写法

javascript 复制代码
function getUser() {
  return fetch("/user")
    .then(res => res.json())
    .then(data => {
      console.log(data)
      return fetch("/order")
    })
    .then(res => res.json())
    .then(order => {
      console.log(order)
    })
    .catch(err => {
      console.log(err)
    })
}

问题:

复制代码
.then 链式调用太多
代码可读性差

async/await 写法

javascript 复制代码
async function getUser() {
  try {
    const res = await fetch("/user")
    const user = await res.json()

    const res2 = await fetch("/order")
    const order = await res2.json()

    console.log(user, order)
  } catch (err) {
    console.log(err)
  }
}

优点:

复制代码
逻辑清晰
更像同步代码
更容易维护

五、async/await 的本质

其实:

csharp 复制代码
async function test() {
  return 1
}

等价于:

javascript 复制代码
function test() {
  return Promise.resolve(1)
}

所以:

javascript 复制代码
async函数一定返回Promise

六、await 的作用

await 只能等待 Promise 对象

例如:

csharp 复制代码
const data = await fetch("/api")

等价于:

scss 复制代码
fetch("/api").then(res => ...)

七、async/await 的限制

1 必须在 async 函数里

错误写法:

csharp 复制代码
const data = await fetch("/api")

正确:

csharp 复制代码
async function getData() {
  const data = await fetch("/api")
}

2 默认是串行执行

csharp 复制代码
const a = await getA()
const b = await getB()

执行顺序:

复制代码
getA → 完成 → getB

有时候会变慢。


八、并发优化(重要)

如果两个请求 互不依赖

错误写法:

csharp 复制代码
const a = await getA()
const b = await getB()

优化写法:

scss 复制代码
const [a, b] = await Promise.all([
  getA(),
  getB()
])

这样会 并发执行


九、什么时候用 Promise?

适合:

  • 并发请求
  • 多个异步任务组合
  • Promise.all
  • Promise.race

例如:

scss 复制代码
Promise.all([api1(), api2(), api3()])

十、什么时候用 async/await?

适合:

  • 顺序执行
  • 复杂逻辑
  • try/catch 错误处理
  • 提高代码可读性

例如:

csharp 复制代码
async function init() {
  const user = await getUser()
  const order = await getOrder(user.id)
}

十一、面试标准回答

可以这样说:

Promise 是 ES6 提供的用于处理异步操作的对象,通过 then 和 catch 进行链式调用。

async/await 是 ES2017 提供的语法,是 Promise 的语法糖,可以让异步代码写起来像同步代码,提高可读性。

async 函数会返回一个 Promise,await 用来等待 Promise 的结果。

在实际开发中,如果是复杂逻辑或者顺序执行,一般使用 async/await;如果是多个异步任务并发执行,通常配合 Promise.all 使用。


十二、再给你一个高级面试点(很多人不会)

很多人不知道:

csharp 复制代码
await 123

也是合法的。

因为 JS 会自动变成:

javascript 复制代码
await Promise.resolve(123)

最后总结

一句话记住:

javascript 复制代码
Promise → 异步机制
async/await → Promise 的更优雅写法
相关推荐
随风一样自由1 天前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
IMPYLH1 天前
HTML 的 <data> 元素
前端·html
YHHLAI1 天前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
weixin_BYSJ19871 天前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
沪飘大军1 天前
ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理
javascript
kyriewen1 天前
我扒了 GPT-5.6 的全部编程跑分——有一项 OpenAI 没敢放出来
前端·gpt·ai编程
前端H1 天前
微前端 v3 架构升级:从加载隔离到状态协同
前端·架构·状态模式
山河木马1 天前
GPU自动处理专题3-NDC怎么映射成屏幕像素坐标(视口变换)
javascript·webgl·图形学
陆枫Larry1 天前
小程序包体积优化:用 SVG 图片替换 iconfont,并保留 CSS 控色能力
前端
Appthing1 天前
在 TanStack Start 中使用 VitePWA 的正确配置
javascript