如何使用AXIOS GET重复调用接口直至返回status为ready?
实现AXIOS重复调用接口直到状态变为ready
可以通过异步递归+延迟重试的方式实现需求,同时要考虑请求失败、无限循环的问题,下面是具体实现:
基础实现(递归重试)
async function waitForReadyStatus() { const response = await axios.get('myUrlApi...'); const data = response.data; // 如果状态还是processing,延迟后递归调用 if (data.success && data.status === 'processing') { // 延迟1秒后重试,可根据实际情况调整间隔 await new Promise(resolve => setTimeout(resolve, 1000)); return waitForReadyStatus(); } // 状态变为ready或者请求失败时返回结果 return data; } // 使用示例 waitForReadyStatus() .then(result => { console.log('最终结果:', result); }) .catch(error => { console.error('请求出错:', error); });
增强版(带超时和重试次数限制)
为了避免无限等待或频繁请求给服务器造成压力,建议添加超时时间和最大重试次数:
async function waitForReadyStatus(maxRetries = 30, retryInterval = 1000) { let retries = 0; while (retries < maxRetries) { try { const response = await axios.get('myUrlApi...'); const data = response.data; if (data.success && data.status === 'ready') { return data; // 状态就绪,返回结果 } else if (data.success && data.status === 'processing') { // 状态仍在处理,延迟后重试 await new Promise(resolve => setTimeout(resolve, retryInterval)); retries++; } else { // 请求成功但状态异常,直接抛出错误 throw new Error('接口返回异常状态'); } } catch (error) { // 请求失败,延迟后重试 await new Promise(resolve => setTimeout(resolve, retryInterval)); retries++; if (retries >= maxRetries) { throw new Error(`超过最大重试次数(${maxRetries}次),请求失败`); } } } } // 使用示例 waitForReadyStatus(20, 1500) // 最多重试20次,每次间隔1.5秒 .then(result => { console.log('最终结果:', result); }) .catch(error => { console.error('获取就绪状态失败:', error); });
关键注意点
- 合理设置重试间隔:不要过于频繁调用接口,避免触发服务器限流或增加服务器负载,建议根据接口处理速度设置1-5秒的间隔。
- 添加重试次数/超时限制:防止因接口一直返回processing导致无限循环,设置最大重试次数或总超时时间。
- 处理异常情况:要捕获请求失败(比如网络错误、接口返回5xx/4xx)的情况,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Paco Zevallos
相关产品推荐
相关产品推荐

