如何将循环调用axios POST请求的所有响应合并为一个对象?
解决多POST请求响应合并为单个对象的问题
原代码的问题
- 循环内部每次重置
promises数组,最终数组仅保留最后一个请求的Promise - 在
push中使用await导致请求串行执行,大幅降低效率 - 未收集响应数据,仅做打印输出,无法进行合并操作
修正后的实现方案
步骤说明
- 批量创建所有请求的Promise(并行发起,提升效率)
- 用
Promise.all等待所有请求完成,获取全部响应数据 - 将响应数据合并为单个对象(使用唯一标识作为键,避免冲突)
代码示例
// 1. 生成所有请求的Promise数组,并行发起请求 const promises = availableSpot.map(spot => { const postBody2 = { PropertyGuid: spot.propertyguid, ZoneGuid: spot.zoneguid, BookingStartUTC: "2022-11-10T18:15:00", BookingEndUTC: "2022-11-10T20:15:00", FilterAmenities: "", SpotGuid: null, UnitGuid: null, }; // 返回Promise并直接提取响应数据 return axios.post(searchZoneUrl, postBody2, requestMetadata2) .then(response => response.data); }); // 2. 等待所有请求完成,获取全部响应结果 const allResponses = await Promise.all(promises); // 3. 合并为单个对象(用PropertyGuid+ZoneGuid作为唯一键) const mergedResult = {}; availableSpot.forEach((spot, index) => { const uniqueKey = `${spot.propertyguid}-${spot.zoneguid}`; mergedResult[uniqueKey] = allResponses[index]; }); // 合并后的对象,可直接用于后续逻辑 console.log(mergedResult);
可选合并方式
如果不需要唯一键,只是想把所有响应的属性合并到一个对象中(注意:重复属性会被后续响应覆盖),可以用:
const mergedResult = Object.assign({}, ...allResponses);
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

