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
相关产品推荐
相关产品推荐

