如何让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
相关产品推荐
相关产品推荐

