如何将多个await异步返回的数据合并为单个统一数组
你遗漏的核心是并行异步Promise的统一等待逻辑和结果聚合的时机,具体问题和修正方案如下:
问题原因
- 你用
map遍历生成了多个独立的Promise实例,每个实例对应一个请求的异步返回结果,没有将这些Promise统一等待执行完成,自然无法收集所有结果合并 - 当前你在每个请求的单独回调里调用
searchRequestBuilder,每次传入的都是单个请求的返回值,所以打印出来的是多个分散的数组,而不是合并后的结果 - 你之前用
push不生效大概率是因为在同步代码中提前读取了还没被所有异步回调填充完的数组,异步请求未完成时数组还处于空或部分填充的状态
修正代码
// 1. 收集所有请求的Promise到数组中 const requestPromises = connections.elements.map((val: any) => { const url = 'link' // 直接返回axios的Promise,不需要额外套一层Promise return axios.post(url, val.firstName).then((res: { data: any }) => { return res.data.AllResults }) }) // 2. 等待所有请求全部执行完成,拿到所有结果的二维数组 const allRequestResults = await Promise.all(requestPromises) // 3. 扁平化二维数组得到合并后的单个数组 const mergedSingleArray = allRequestResults.flat() // 4. 统一处理合并后的结果 const searchRequestBuilder = (data: any) => { console.log(data) // 此处输出就是你要的单个数组 // 后续你的处理逻辑 } searchRequestBuilder(mergedSingleArray)
核心技术要点
- 多个并行的异步Promise必须使用
Promise.all统一等待,所有请求完成后才会返回包含所有结果的集合 - 聚合逻辑必须放在所有异步操作完成之后执行,不能在单个异步回调中做聚合处理
- 如果每个接口返回的都是子数组,需要用
flat()方法将二维数组扁平化转为一维数组,也可以用Array.prototype.concat.apply([], allRequestResults)实现相同效果
内容的提问来源于stack exchange,提问作者user16691768
相关产品推荐
相关产品推荐

