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

如何让Axios GET请求持续调用直至返回指定结果?

实现Axios轮询直至获取成功状态结果

你需要实现轮询机制,重复调用API直到返回status: "succeeded"的响应,同时要加入延迟避免频繁请求,还要设置超时防止无限循环。

以下是可行的代码实现:

// 封装延迟函数,用于轮询间隔
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

// 轮询获取结果的async函数
async function pollForSucceededResult(url, headers, timeout = 30000, interval = 2000) {
  const startTime = Date.now();
  
  while (true) {
    try {
      const result = await axios.get(url, { headers });
      const data = result.data;
      
      if (data.status === "succeeded") {
        // 拿到成功结果,返回数据
        return data;
      } else if (data.status === "running") {
        // 任务还在运行,检查是否超时
        if (Date.now() - startTime > timeout) {
          throw new Error("轮询超时,未获取到成功结果");
        }
        // 延迟指定时间后重试
        await delay(interval);
      } else {
        // 其他状态(比如failed),直接抛出错误
        throw new Error(`任务状态异常:${data.status}`);
      }
    } catch (error) {
      // 捕获请求错误或自定义错误,抛出给调用方处理
      throw new Error(`轮询失败:${error.message}`);
    }
  }
}

// 调用示例
async function getResult() {
  try {
    const finalResult = await pollForSucceededResult(
      "你的API地址",
      { /* 请求头 */ },
      30000, // 总超时时间30秒
      2000   // 每2秒重试一次
    );
    console.log("成功获取结果:", finalResult);
    // 这里可以处理analyzeResult数据
  } catch (error) {
    console.error(error.message);
  }
}

getResult();

关键说明:

  • 延迟函数:delay用Promise封装setTimeout,配合await实现异步延迟,避免阻塞事件循环。
  • 超时控制:通过记录开始时间,每次重试前检查是否超过设定的总超时时间,防止无限轮询。
  • 状态判断:严格区分succeeded、running和其他异常状态,分别处理返回、重试或抛出错误。
  • 错误捕获:捕获请求过程中的网络错误、超时错误等,统一抛出便于调用方处理。

内容的提问来源于stack exchange,提问作者Saumitra07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:45:31