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

如何实现最多重试n次API请求,直到response.data.status为done?

实现DeepL文档API请求的重试逻辑(直到返回status="done"或达到最大重试次数)

下面是完整的实现方案,直接可用且逻辑清晰:

const axios = require("axios");
const qs = require("qs");

// 替换为你的DeepL API密钥
const apiKey = "你的API_KEY";

// 封装重试逻辑的异步函数
async function checkDocumentStatus(maxRetries = 10, retryDelay = 1000) {
  const data = qs.stringify({
    document_key: "038A2E0792CE72020E9BB88380D002EB582A6B3AE5883C34DE53C9F17D415D99",
  });

  const config = {
    method: "post",
    maxBodyLength: Infinity,
    url: "https://api-free.deepl.com/v2/document/95BA71197AC66EE4745FF5269CF4399D",
    headers: {
      Authorization: apiKey,
      "Content-Type": "application/x-www-form-urlencoded",
    },
    data: data,
  };

  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await axios.request(config);
      const status = response.data.status;
      console.log(`第${attempt}次请求,当前状态:${status}`);

      if (status === "done") {
        console.log("文档处理完成!");
        return response.data; // 返回完整结果,方便后续处理
      }

      // 未完成则等待指定时间后重试(最后一次无需等待)
      if (attempt < maxRetries) {
        await new Promise(resolve => setTimeout(resolve, retryDelay));
      }
    } catch (error) {
      console.log(`第${attempt}次请求失败:${error.message}`);
      // 请求失败也计入重试次数,等待后继续
      if (attempt < maxRetries) {
        await new Promise(resolve => setTimeout(resolve, retryDelay));
      } else {
        throw new Error(`达到最大重试次数(${maxRetries}次),请求最终失败`);
      }
    }
  }

  throw new Error(`达到最大重试次数(${maxRetries}次),文档状态仍未变为done`);
}

// 调用示例:最多重试15次,每次间隔2秒
checkDocumentStatus(15, 2000)
  .then(result => {
    // 这里可以处理完成后的结果,比如获取翻译后的文档
    console.log("最终结果:", result);
  })
  .catch(error => {
    console.error(error.message);
  });

核心逻辑说明

  • 异步函数封装:用async/await处理异步请求,让重试循环的逻辑更直观易读,避免Promise链式调用的嵌套复杂度;
  • 重试循环控制:通过for循环精准控制重试次数,每次请求后判断状态:
    • 状态为done时直接返回结果并终止流程;
    • 未完成且未到最大次数时,等待指定延迟后重试;
  • 错误兜底处理:网络问题、API限流等请求失败场景也计入重试次数,达到最大次数后抛出明确错误,方便上层捕获处理;
  • 可配置参数:函数默认设置了10次重试、1秒间隔,你可以根据需求调整maxRetries和retryDelay参数。

注意事项

  • 不要把重试间隔设置得太小,避免触发DeepL API的限流机制,建议至少1秒以上;
  • 务必替换代码中的apiKey为你自己的DeepL API密钥;
  • 如果需要处理error等异常状态,可以在循环中增加判断逻辑,提前终止重试并抛出对应错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:22