如何通过Axios获取状态变为ready的多请求响应?
批量任务状态轮询直至就绪的实现方案
你的需求是批量发起请求,等待每个任务的状态从processing变为ready后获取最终响应,核心是给每个任务添加轮询逻辑,直到满足状态条件为止。以下是优化后的可运行代码:
1. 封装单个任务的轮询函数
// 单个任务的轮询逻辑,直到status变为ready const pollTaskStatus = async (taskId: string, interval = 1000, timeout = 60000) => { const url = `urlApi...${taskId}`; // 替换为你的实际API地址 const startTime = Date.now(); while (true) { // 超时判断,避免无限轮询 if (Date.now() - startTime > timeout) { throw new Error(`任务 ${taskId} 轮询超时`); } try { const response = await axios.get(url); const { success, status } = response.data; if (success && status === 'ready') { return response.data; // 返回就绪状态的响应数据 } } catch (error) { console.error(`轮询任务 ${taskId} 出错:`, error); } // 等待指定间隔后发起下一次请求 await new Promise(resolve => setTimeout(resolve, interval)); } };
2. 批量处理所有任务的轮询
const statusOrder = async (data: { task_id: string }[]) => { // 为每个任务生成对应的轮询Promise const pollPromises = data.map(element => pollTaskStatus(element.task_id)); try { // 等待所有任务都完成轮询(变为ready) const resultados = await Promise.all(pollPromises); console.log('所有任务就绪,结果:', resultados); return resultados; } catch (error) { console.error('轮询过程出错:', error); throw error; // 可根据业务需求决定是否抛出错误 } };
关键说明
- 轮询配置:默认1秒轮询一次、超时时间60秒,可根据实际业务场景调整
interval和timeout参数 - 错误处理:单个任务请求失败时会打印错误并继续轮询;超时后会抛出错误,避免无限等待
- 类型优化:替换了原代码中的
any类型,使用明确的类型定义提升代码可维护性 - 并发控制:如果任务数量较多,可引入并发限制库(如
p-limit)控制同时发起的轮询请求数,避免给服务器造成过大压力
内容的提问来源于stack exchange,提问作者Paco Zevallos
相关产品推荐
相关产品推荐

