You need to enable JavaScript to run this app. 如何基于URL数组并发发起多个Axios GET请求拉取学生待办作业
优惠活动
大模型
产品
解决方案
定价
更多

如何基于URL数组并发发起多个Axios GET请求拉取学生待办作业

核心问题定位

你之前的代码存在三处可直接定位的逻辑错误,完全不需要复杂排查:

  • 误区1:axios.all() 接收的入参是已构造完成的Promise请求对象数组,不是纯URL字符串数组。最初传[urls]本质是把字符串当请求任务传,根本没有触发对应接口的调用逻辑,后续出现的401报错、鉴权头丢失都是这个逻辑错位导致的。
  • 误区2:验证单请求可用后,仅写死了urls[0]对应的一个GET请求,数组内其余URL没有生成对应的请求任务,自然无法实现全量并发。
  • 误区3:响应遍历逻辑错位。axios.spread解包后的集合是和请求任务一一对应的响应列表,每个元素是单条请求的完整响应对象,不存在顶层的res.data属性;之前的循环一直只读取res[0].data,就算全量请求成功也只会拿到第一个课程的作业数据。
正确实现方案

实现逻辑

  1. 遍历已拼接完成的urls数组,为每一个URL生成携带鉴权头的axios.get() Promise实例,收集成待执行的请求列表。
  2. 把请求列表传给axios.all()发起全量并发请求,等待所有响应返回。
  3. 逐个遍历每个课程接口的响应结果,筛选出截止日期晚于当前时间的作业,汇总成最终的返回数组。

可直接参考的完整代码

// 初始化待返回的作业数组
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 22:57:05