如何实现最多重试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
相关产品推荐
相关产品推荐

