如何实现带3次重试机制的API调用JavaScript循环?
问题分析与修复方案
你的代码存在两个核心问题,导致无法实现预期的重试逻辑:
1. 错误发生时直接抛出异常,终止循环
catch块里直接执行throw err,会让第一次API调用出错就立刻终止整个流程,完全没有机会进入后续的重试循环。
2. 循环次数逻辑易混淆
i <= maxTries会让循环执行4次(i从0到3),如果你的需求是最多重试3次(即总共尝试4次),这个条件没问题;但如果是最多尝试3次(含首次调用),应该改成i < maxTries。
修复后的代码
let data const maxTries = 3 for (let i = 0; i <= maxTries; i++) { try { data = await getJson(url, true) // 接口成功返回有效数据,直接返回结果并终止循环 if (data) { return data } // 接口成功但返回空数据,按需选择是否继续重试 console.log('接口返回空数据,准备重试') } catch (err) { console.error(`第${i+1}次调用失败:`, err) // 仅当最后一次尝试失败时,才抛出错误终止流程 if (i === maxTries) { throw new Error(`经过${maxTries+1}次尝试后仍调用失败: ${err.message}`) } } }
额外补充
- 若需求是只要接口成功响应就终止循环(无论数据是否为空),可以删除
if(data)的判断,直接return data - 可根据场景添加重试间隔,比如在
catch块中加入await new Promise(resolve => setTimeout(resolve, 1000)),避免短时间内频繁请求接口
内容的提问来源于stack exchange,提问作者wycherley22
相关产品推荐
相关产品推荐

