React Native多接口请求返回值异常问题排查
你遇到的问题是用Promise.all并行请求10个国家的数据后,结果数组长度符合预期但出现重复值、部分国家数据缺失,我来帮你排查可能的原因:
一、最可能的原因:this.country对象的URL配置重复
先优先检查你的this.country对象中,A-J这10个键对应的URL是否存在重复。比如如果this.country["A"]和this.country["I"]、this.country["J"]都指向了COUNTRY3的域名,那请求回来的数据自然会重复。
你可以在fetchData方法开头先打印所有国家的URL,确认每个值都是唯一的:
console.log('Country URLs:', Object.values(this.country));
二、冗余的Promise.all调用(不影响顺序但易增加混淆)
看你的代码,第一个Promise.all已经等待所有axios请求完成,返回的res1-res10都是已resolved的响应对象,res.data是同步可用的,完全不需要再用第二个Promise.all包裹。这一步可以简化成更清晰的写法,还能避免手动解构10个变量的潜在失误:
.then((responses) => { // 直接从响应数组映射出需要的价格字段 return responses.map(res => res.data[this.priceSelector]); }) .then(rawLoaded => { console.log(rawLoaded); if (rawLoaded.length === 10) { this.setState({ isloading: true, rawPrice: rawLoaded }); } })
三、检查this.priceSelector的稳定性
确认this.priceSelector在整个异步请求过程中没有被意外修改。比如如果这个值是动态变化的变量,或者是引用类型(比如对象),可能导致所有res.data[this.priceSelector]取到同一个值。你可以在请求前打印这个值验证:
console.log('Price selector:', this.priceSelector);
四、axios缓存或服务器端重复响应
如果多个请求的URL完全相同,浏览器或axios的缓存机制可能会返回之前的响应结果,导致数据重复。你可以给每个请求加一个唯一的时间戳参数禁用缓存:
axios.get(`${this.country["A"]}${this.props.productLink}?t=${Date.now()}`)
这样每个请求都是唯一的,能避免缓存干扰。
先从检查this.country的URL配置开始,这是最常见的导致重复数据的原因。如果URL都正确,再依次排查其他可能性。
内容的提问来源于stack exchange,提问作者helloworld

