如何基于URL数组并发发起多个Axios GET请求拉取学生待办作业
核心问题定位
你之前的代码存在三处可直接定位的逻辑错误,完全不需要复杂排查:
- 误区1:
axios.all()接收的入参是已构造完成的Promise请求对象数组,不是纯URL字符串数组。最初传[urls]本质是把字符串当请求任务传,根本没有触发对应接口的调用逻辑,后续出现的401报错、鉴权头丢失都是这个逻辑错位导致的。 - 误区2:验证单请求可用后,仅写死了
urls[0]对应的一个GET请求,数组内其余URL没有生成对应的请求任务,自然无法实现全量并发。 - 误区3:响应遍历逻辑错位。
axios.spread解包后的集合是和请求任务一一对应的响应列表,每个元素是单条请求的完整响应对象,不存在顶层的res.data属性;之前的循环一直只读取res[0].data,就算全量请求成功也只会拿到第一个课程的作业数据。
正确实现方案
实现逻辑
- 遍历已拼接完成的
urls数组,为每一个URL生成携带鉴权头的axios.get()Promise实例,收集成待执行的请求列表。 - 把请求列表传给
axios.all()发起全量并发请求,等待所有响应返回。 - 逐个遍历每个课程接口的响应结果,筛选出截止日期晚于当前时间的作业,汇总成最终的返回数组。
可直接参考的完整代码
// 初始化待返回的作业数组 const assignments = [] // 提前生成当前时间的ISO格式字符串,避免重复转换 const currentTime = new Date().toISOString() // 遍历所有课程URL,生成带鉴权的请求Promise列表 const requestList = urls.map(url => axios.get(url, { headers: { Authorization: `Bearer ${token}` } })) // 发起全量并发请求 axios.all(requestList) .then(responses => { // 遍历每个课程对应的响应 for (const courseResponse of responses) { // 遍历当前课程下的所有作业 for (const assignment of courseResponse.data) { // 筛选未到期的作业 if (assignment.due_at > currentTime) { assignments.push(assignment) } } } console.log('筛选后的待交作业列表:', assignments) }) .catch(err => console.error('请求异常:', err))
补充说明
- 不需要手动写for循环逐一生成请求push到数组,用数组
map方法生成Promise列表是最简洁的实现,既不会遗漏URL,也能保证所有请求同时并发发起,不会出现串行等待的性能问题。 - 因为你定义的
getAssignments是async函数,完全可以用await替代链式.then()写法,让逻辑更闭环:async function getAssignments() { const assignments = [] const currentTime = new Date().toISOString() const requestList = urls.map(url => axios.get(url, { headers: { Authorization: `Bearer ${token}` } })) // 等待所有请求完成 const responses = await axios.all(requestList) for (const courseResponse of responses) { for (const assignment of courseResponse.data) { if (assignment.due_at > currentTime) { assignments.push(assignment) } } } return assignments } - 时间比较时注意保持两边格式统一,接口返回的
due_at一般是ISO 8601格式的字符串,直接和同格式的当前时间字符串比较即可,不需要手动转时间戳。
内容的提问来源于stack exchange,提问作者OrangeCry
相关产品推荐
相关产品推荐

