无法遍历接口返回的数组数据,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
相关产品推荐
相关产品推荐

