如何正确实现最多5次API请求直至获取预期结果?
问题分析与修复
你的代码存在两个核心问题,导致只执行了一次请求:
getText是一次性Promise:Promise对象一旦创建并执行,其状态(成功/失败)就固定了。后续无论多少次调用.then()或.catch(),都只会复用第一次请求的结果,不会重新发起新的网络请求。异步流程未正确等待:
tryToUpdate是async函数,但内部没有用await等待getText的结果,导致函数直接执行完毕返回,不会等请求完成后再走重试逻辑。
修正后的代码
// 改成函数,每次调用都会发起新的fetch请求 async function getText() { const response = await fetch('URL'); const data = await response.json(); const retorno = data?.result[0]?.edited_channel_post?.text; if (retorno?.includes('Texto:')) { return { data: retorno }; } else { throw new Error('unavailable'); } } async function tryToUpdate(tries = 0) { if (tries >= 5) { console.log('Cant update.'); return undefined; } try { const result = await getText(); console.log('获取到正确数据:', result); return result; } catch (err) { console.log('Cannot reach result. Try num:' + tries); // 递归重试,等待重试结果并返回 return tryToUpdate(tries + 1); } }
关键修改说明
- 将
getText从Promise对象改为async函数:每次调用getText()都会重新执行fetch,发起新的网络请求,确保每次重试都是全新的请求。 - 使用
async/await处理异步流程:让代码逻辑更线性清晰,确保每次请求完成后再判断是否需要重试,避免函数提前返回。 - 修复数据判断逻辑:给
retorno.includes加上可选链,避免retorno为undefined时触发报错;同时在try块中正确接收并返回获取到的有效数据。 - 递归重试时返回结果:确保递归调用的结果能被上层函数接收,最终返回成功获取的数据或undefined。
内容的提问来源于stack exchange,提问作者Victor Lucas Mazzotti
相关产品推荐
相关产品推荐

