You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Node.js中如何使用axios循环发起批量HTTP请求

问题根因
  • 现有代码中for循环内的await会强制等待当前IP查询请求完成后,才会发起下一个用户的请求,所有请求完全串行执行,总耗时为所有单个请求耗时的累加,这就是总耗时达到10秒的核心原因
  • 不使用await拿不到结果是因为异步请求还未完成,函数就已经提前返回了用户数组,此时countryCode字段还未被赋值
优化方案

将串行请求改为并行请求,利用Promise.all批量等待所有异步请求完成,总耗时仅等于最慢的单个请求耗时,可大幅降低整体执行时间。优化后代码如下:

async function getAllusers() {
  let allUsersData = await usersDao.getAllusers();

  // 构造所有IP查询请求的Promise数组,并行发起所有请求
  const requestTasks = allUsersData.map(async (user, index) => {
    const data = { ip: user.ip };
    const body = new URLSearchParams(data);
    try {
      const res = await axios.post("http://myAPI", body);
      allUsersData[index].countryCode = res.data.countryCode;
    } catch (err) {
      // 单个请求失败时可设置默认值,避免单个异常导致整个函数报错
      allUsersData[index].countryCode = 'UNKNOWN';
      console.error(`查询IP ${user.ip} 归属地失败:`, err);
    }
  });

  // 等待所有请求全部执行完成
  await Promise.all(requestTasks);
  return allUsersData;
}
额外注意事项
  • 如果查询接口有并发请求数限制,可以做分批并发控制,比如每批同时发起5-10个请求,处理完一批再发起下一批,避免触发接口限流规则
  • 建议不要混用await和.then写法,统一用await处理异步逻辑可读性更高
  • 如果用户量非常大,建议优先考虑IP归属地本地查询库,相比调用远程接口性能会提升多个数量级

内容的提问来源于stack exchange,提问作者Y F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:24:04