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

无法遍历接口返回的数组数据,forEach、for..of、map方法均失效如何解决

问题原因

你的判断是对的,问题本质是异步执行顺序问题:Promise.all(promises)本身是异步方法,你没有等待所有GET请求执行完成就提前访问了allOrders数组,此时数组还未完成数据填充,自然无法正常遍历。

解决方案

有两种常用的写法可选:

方案1:async/await写法(更推荐,可读性更高)

给当前逻辑所在的外层函数添加async修饰符,用await等待Promise.all执行完成后再操作allOrders:

// 仅需给外层函数加上async修饰即可,示例:
async function fetchAllOrders() {
  const pageCount = Math.ceil((sortBy === 'deliveryInfo.slotStart' ? countTotalDeliveryDatePageResp : pageResponse) / 20);
  // for excel export
  let allOrders = [];
  let promises = [];

  for(let pageNum = 0; pageNum < pageCount; pageNum++){
    let excelOrderAPI = sortBy === 'deliveryInfo.slotStart' 
      ? `orders/delivery/${region_id}/${endDeliveryDate}?page=${pageNum}&size=20` 
      : `/orders/details/?page=${pageNum}&placedDate.specified=true&placedDate.greaterThanOrEqual=${startDate}&placedDate.lessThanOrEqual=${endDate}&size=20&sort=${sortBy},desc&status.in=${selected.join(',')}`;
    
    promises.push(
      axios.get(excelOrderAPI, {
        headers: {
          'Authorization': jwtToken,
          'Accept' : '*/*',
          'Content-Type': 'application/json',
          'App-Token' : 'A14BC'
        }
      })
      .then(order =>{
        if(order?.data?.length > 0){
          // 直接用扩展运算符批量插入,不需要额外写map遍历
          allOrders.push(...order.data)
        }
      })
      // 可选:添加异常捕获,避免单页请求失败导致全量数据拿不到
      .catch(err => console.error(`第${pageNum}页订单请求失败:`, err))
    )
  }

  // 等待所有请求执行完成
  await Promise.all(promises);
  // 所有后续操作(遍历、导出Excel等)都写在await之后即可正常访问allOrders
  console.log(allOrders);
}

方案2:Promise.then回调写法

如果不想修改外层函数的async修饰,也可以把后续逻辑写在Promise.all的then回调中:

// 前面的循环、收集promises的逻辑和原代码一致
Promise.all(promises).then(() => {
  // 所有请求执行完成,此处可以正常操作allOrders
  console.log(allOrders);
})

优化建议

  • 原代码中用map仅做遍历没有用到返回值,属于不必要的写法,直接用扩展运算符push(...order.data)批量插入数据更简洁
  • 建议给每个请求添加异常捕获,避免某一页请求失败导致Promise.all直接终止,拿不到其他页的正常数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:39:03