MST

星途 面试题库

面试题:JavaScript async/await 异常捕获与性能优化

在一个高并发的 JavaScript 应用中,大量使用 async 和 await 进行异步操作。当其中某个异步任务频繁抛出异常时,会影响整体性能。请阐述如何在捕获异常的同时,对这种情况进行性能优化,例如减少不必要的重试、合理分配资源等。请给出具体的优化策略和代码示例。
23.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

优化策略

  1. 集中异常处理:在合适的层级统一捕获异常,避免每个 await 都单独处理,减少重复代码和性能开销。
  2. 设置重试机制:为频繁出错的任务设置合理的重试次数,避免无限制重试浪费资源。
  3. 错误分类处理:根据异常类型进行不同处理,对可恢复的异常进行重试,对不可恢复的异常直接处理。
  4. 资源分配优化:在重试过程中合理分配资源,比如限制重试频率,避免短时间内消耗过多资源。

代码示例

// 模拟一个异步任务
async function asyncTask() {
    // 模拟50%概率抛出异常
    if (Math.random() > 0.5) {
        throw new Error('任务出错');
    }
    return '任务成功';
}

// 集中异常处理和重试机制
async function runWithRetry(task, maxRetries = 3, retryInterval = 1000) {
    let retries = 0;
    while (retries < maxRetries) {
        try {
            return await task();
        } catch (error) {
            retries++;
            if (retries >= maxRetries) {
                throw error;
            }
            console.log(`捕获异常,重试第 ${retries} 次,等待 ${retryInterval} 毫秒...`);
            await new Promise(resolve => setTimeout(resolve, retryInterval));
        }
    }
}

// 执行任务
runWithRetry(asyncTask).then(result => {
    console.log(result);
}).catch(error => {
    console.error('最终失败:', error);
});

在上述代码中,asyncTask 模拟一个可能抛出异常的异步任务。runWithRetry 函数实现了集中异常处理和重试机制,设置了最大重试次数 maxRetries 和重试间隔 retryInterval,通过 while 循环和 try - catch 块来捕获异常并进行重试,同时在每次重试前等待一定时间,避免短时间内过度重试消耗资源。