MST

星途 面试题库

面试题:JavaScript 异步编程中 Async/Await 的深度理解

已知一个函数`fetchData`返回一个 Promise,它模拟从服务器获取数据的异步操作。现在有一个需求,要在获取数据后进行数据处理,如果处理失败,需要进行重试,最多重试 3 次,每次重试间隔 1 秒。请使用 Async/Await 实现该功能,并说明`try...catch`在其中的作用。
33.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
async function fetchData() {
    // 模拟异步操作
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // 这里模拟成功或失败,实际应是真实的服务器请求
            Math.random() > 0.5? resolve('data') : reject('error');
        }, 1000);
    });
}

async function processData() {
    const maxRetries = 3;
    let retries = 0;
    while (retries < maxRetries) {
        try {
            const data = await fetchData();
            // 处理数据
            const processedData = data.toUpperCase();
            console.log(processedData);
            return processedData;
        } catch (error) {
            retries++;
            console.log(`处理失败,重试第 ${retries} 次`);
            if (retries === maxRetries) {
                console.log('达到最大重试次数,放弃重试');
                throw error;
            }
            await new Promise(resolve => setTimeout(resolve, 1000));
        }
    }
}

processData().catch(console.error);

try...catch的作用:

  1. 捕获异常:在try块中执行await fetchData()和数据处理代码,catch块捕获在这个过程中抛出的任何错误,这样可以避免错误导致整个程序终止。
  2. 实现重试逻辑:当捕获到错误时,增加重试次数retries,如果未达到最大重试次数,等待1秒后再次尝试执行try块中的代码,实现重试机制。当达到最大重试次数后,再次抛出错误,以便外层调用代码可以根据需要进行处理。