You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中何时该使用async/await,何时该使用回调函数?

两种异步请求写法的适用场景

首先澄清一个概念:你提到的.then/.catch链式写法本质是Promise原生链式调用,并非传统的嵌套回调模式,传统回调是多层函数嵌套的写法,目前已经基本被Promise体系替代。以下是两种写法的适用场景区分:

优先使用async/await的场景

  • 存在多个有依赖关系的串行异步请求:比如需要先获取用户ID,再通过用户ID查询订单列表,再通过订单ID查询订单详情,async/await可以按照同步代码的顺序书写,不会出现链式调用多层嵌套的「回调地狱」问题,可读性和可维护性更高。
    // async/await 写法逻辑非常直观
    try {
      const user = await getUserInfo()
      const orderList = await getOrderList(user.id)
      const orderDetail = await getOrderDetail(orderList[0].id)
    } catch (err) {
      console.error('请求出错', err)
    }
    
  • 需要在异步请求之间穿插同步处理逻辑:比如请求完第一个接口后需要做复杂的数据格式化、参数计算,再发起第二个请求,async/await可以自然插入同步逻辑,不需要把代码拆分到多个.then的回调函数中。
  • 需要精细化区分不同请求的错误:可以用多个try/catch块分别包裹不同的异步请求,单独捕获某一步的错误做定制化处理,不会阻断后续其他逻辑的执行。

优先使用Promise链式调用的场景

  • 单步简单异步调用,无后续依赖:比如只需要发一个行为上报请求,不需要处理返回结果也没有后续逻辑,直接写链式调用更简洁,不需要额外把逻辑包裹进async函数。
    // 单步调用写法更短
    axios.post('/api/report', { action: 'view_page' }).catch(err => console.log(err))
    
  • 并行处理多个异步请求:配合Promise.all、Promise.race、Promise.allSettled等批量处理Promise的方法时,链式写法更轻便,不需要额外定义变量接收返回值。
  • 需要对外返回Promise实例:比如封装通用请求工具函数时,直接返回链式调用处理后的Promise实例即可,不需要写async函数再封装一层。

最后补充注意点:你给出的async/await示例没有做错误捕获,实际使用时需要用try/catch包裹await逻辑,或者给await后的Promise主动挂载catch方法,否则请求报错会抛出未捕获的Promise异常。

内容的提问来源于stack exchange,提问作者Jeremy Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:24:02