You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现最多5次API请求直至获取预期结果?

问题分析与修复

你的代码存在两个核心问题,导致只执行了一次请求:

  1. getText是一次性Promise:Promise对象一旦创建并执行,其状态(成功/失败)就固定了。后续无论多少次调用.then()或.catch(),都只会复用第一次请求的结果,不会重新发起新的网络请求。

  2. 异步流程未正确等待: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:45:19