MST

星途 面试题库

面试题:JavaScript async/await 与 Promise 的性能比较及场景应用

分析在高并发场景下,JavaScript 的 async/await 和原生 Promise 在性能方面的差异。并阐述在哪些具体场景下,更适合使用 async/await,哪些场景更适合使用原生 Promise ,说明原因。
21.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

性能差异分析

  1. 代码可读性影响性能认知:从性能角度,async/await 基于 Promise 实现,本质上两者在高并发场景下核心性能差异不大。但 async/await 以同步书写风格处理异步操作,代码可读性更高。良好的代码可读性有助于开发和维护,间接对性能优化产生积极影响。例如复杂异步逻辑,async/await 使代码逻辑更清晰,减少潜在错误,优化性能。而原生 Promise 链式调用在复杂场景下可能代码结构混乱,增加维护成本,影响性能。
  2. 微任务队列执行差异async/await 内部通过 Promise 实现,await 会暂停函数执行,将后续代码放入微任务队列。原生 Promise 中,.then() 回调也在微任务队列执行。但在复杂嵌套或多个 await 连续使用时,async/await 微任务队列管理相对更直观。比如一系列顺序执行异步操作,async/await 更能明确操作顺序和微任务执行时机。

适用场景及原因

  1. 适合 async/await 的场景
    • 顺序执行异步操作:当需要按顺序依次执行多个异步任务,如先从 API 获取用户信息,再根据用户信息获取用户订单,async/await 同步书写方式使代码简洁直观。示例:
async function getUserOrder() {
    const user = await getUserInfo();
    const order = await getOrderByUser(user.id);
    return order;
}
- **错误处理简洁性**:`async/await` 可以使用传统的 `try...catch` 块捕获错误,相比原生 `Promise` 通过 `.catch()` 统一捕获,在局部错误处理上更方便。例如:
async function asyncFunction() {
    try {
        const result = await someAsyncOperation();
        // 处理结果
    } catch (error) {
        // 处理错误
    }
}
  1. 适合原生 Promise 的场景
    • 并行执行异步操作:当多个异步任务相互独立,可并行执行,使用 Promise.allPromise.race 能充分利用原生 Promise 优势。如同时发起多个 API 请求获取数据:
const promise1 = fetch('api1');
const promise2 = fetch('api2');
Promise.all([promise1, promise2]).then(([response1, response2]) => {
    // 处理响应
});
- **与现有基于 Promise 的库集成**:如果项目中大量使用基于原生 `Promise` 的库,直接使用原生 `Promise` 能更好集成,避免引入 `async/await` 带来不必要复杂度。