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

如何在map方法外部获取push后的数组数据?

问题原因与解决方案

为什么外部拿不到更新后的arr?

  • 组件挂载时,外部的console.log(arr)会先于useEffect里的异步请求执行,此时请求还没发起,arr自然是空的。
  • 你用的是普通变量arr,就算后续异步请求完成并push了数据,React不会因为普通变量变化重新渲染组件,所以外部的console.log不会再次执行,也就看不到更新后的值。
  • 另外,x?.map里的异步函数会返回Promise,但你没等待所有请求完成,可能部分数据还没push就去用arr了。

正确的解决办法

用React的useState管理数组状态,再用Promise.all等待所有异步请求完成,保证数据全部加载后再更新状态:

import { useState, useEffect } from 'react';

// ...

const [arr, setArr] = useState([]);

useEffect(() => {
  // 把所有异步请求包装成Promise数组
  const fetchPromises = x?.map(async (id) => {
    try {
      const response = await fetch(`https://www.roads.com/roads/api/web/bk/${id}`);
      const data = await response.json();
      // 返回当前请求得到的经纬度,不要直接push到数组
      return [data?.data?.latitude, data?.data?.longitude];
    } catch (error) {
      console.log(error);
      return []; // 出错时返回空数组,不影响后续合并
    }
  }) || [];

  // 等待所有请求完成,合并结果
  Promise.all(fetchPromises).then((results) => {
    // 把二维数组扁平化,得到最终的经纬度数组
    const mergedArr = results.flat();
    setArr(mergedArr);
    // 这里可以拿到完整的数组
    console.log(mergedArr);
  });
}, [x])

// 组件渲染时会根据arr的最新值更新,这里的console.log会在每次arr变化时执行
console.log(arr);

关键改动说明

  • 用useState代替普通变量:状态更新时会触发组件重新渲染,外部的console.log(arr)会打印最新值。
  • 用Promise.all等待所有请求完成:确保所有数据都返回后再合并更新,避免只拿到部分数据。
  • 避免混用async/await和.then:代码更清晰,也更容易处理错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:05:30