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

使用Axios+Promise.all批量请求API遇问题:结果含undefined

问题分析

你的代码存在两个核心问题,导致结果数组出现undefined和404错误:

  1. use_api函数没有返回值,async函数默认返回undefined,因此Promise.all收集到的结果全是undefined
  2. 省份编号数组包含无效编号(比如20,法国科西嘉岛的省份现已调整为2A和2B),触发API返回404
修复方案

1. 修正API请求函数,让它返回明确结果

修改use_api,使其返回请求到的省份数据,请求失败时返回null(方便后续过滤无效项):

const axios = require('axios')

async function use_api(dep) {
  try {
    const response = await axios.get(`https://geo.api.gouv.fr/departements/${dep}?fields=region`);
    // 返回实际需要的业务数据,而非完整response对象
    return response.data;
  } catch (err) {
    console.error(`获取省份${dep}失败:`, err.message);
    return null;
  }
};

2. 生成正确的省份编号数组

跳过无效编号20,替换为科西嘉的2A、2B,同时覆盖本土省份的有效编号:

let postalCode_all = [];

// 生成1-19、21-95的本土省份编号
for(let i = 1; i <= 95; i++) {
  if(i === 20) continue;
  postalCode_all.push(i < 10 ? `0${i}` : `${i}`);
}
// 添加科西嘉的两个有效省份
postalCode_all.push('2A', '2B');
// 若需海外省,可追加以下编号:
// postalCode_all.push('971', '972', '973', '974', '976');

3. 批量请求并过滤无效结果

通过Promise.all收集所有请求结果后,过滤掉标记为null的无效数据:

(async () => {
  const rawResults = await Promise.all(
    postalCode_all.map(dep => use_api(dep))
  );
  // 过滤请求失败的项,得到有效省份数据
  const validDepartements = rawResults.filter(item => item !== null);
  console.log('有效省份数据:', validDepartements);
})();
额外说明
  • 避免使用全局数组存储结果,Promise.all本身会自动收集所有异步操作的返回值,更符合异步编程规范
  • 提前过滤无效编号比请求后处理更高效,可参考法国官方省份编号列表确保数组准确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:24:20