使用Axios+Promise.all批量请求API遇问题:结果含undefined
问题分析
你的代码存在两个核心问题,导致结果数组出现undefined和404错误:
use_api函数没有返回值,async函数默认返回undefined,因此Promise.all收集到的结果全是undefined- 省份编号数组包含无效编号(比如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
相关产品推荐
相关产品推荐

