使用forEach循环异步方法,导致使用深拷贝时,得不到最新数据,控制台会打印出最新的数据

在使用forEach循环遍历一个数组,如果循环时有异步方法,会导致最终深拷贝得不到最新数据,但是控制台会打印最新的数据

复制代码
const arr = [
      { name: "Jone", age: 18 },
      { name: "Tom", age: 15 },
      { name: "Liu", age: 48 }
    ];

    function funTimeout (param) {
      return new Promise((resolve) => {
        setTimeout(() => { resolve(170) }, 1000)
      })
    };

    function getData () {
      arr.forEach(async (item) => {
        const res = await funTimeout(item);
        item.height = res
      });
      
      console.log(arr, 'arrr');
      console.log(JSON.parse(JSON.stringify(arr)), 'copyArr');
    }
  getData()

上面代码在控制台执行的结果,如图

使用JSON.parse(JSON.stringify())深拷贝后,height属性为追加到arr 数组中。刚开始以为是JSON.parse(JSON.stringify())的原因,还是使用lodash的_.cloneDeep,发现结果是一样的,

最后发现,这是由于forEach不会等待异步方法执行完成,以下是 MDN 的解释

解决方法:

1、使用原始的 for 循环;

2、使用 map 和 promise.all()

这个问题凸显出自己本身Js基本功还不扎实,需要加强练习

相关推荐
万少2 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
小爬的老粉丝4 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
满栀5855 小时前
状态管理:Redux、Vuex、Pinia 核心区别
前端·javascript·typescript
大龄码农有梦想7 小时前
Vue + BPMN.js + Camunda:搭建企业级流程设计器完整实践
javascript·vue.js·流程设计器·bpmn.js·bpmn·流程审批·工作流设计器
Eloudy8 小时前
ReAct 原理简介
前端·javascript·人工智能·react.js·agent·gpu
ZJU_统一阿萨姆9 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
夏天一说说10 小时前
API 安全】API-Pentest:基于 JS 分析 + AI Agent 的自动化 API 渗透测试工具实战指南
javascript·人工智能·安全·api
sunly_10 小时前
TypeScript总结:16、面向对象速查
前端·javascript·typescript
张元清10 小时前
React useInterval Hook:没有过期闭包的 setInterval (2026)
javascript·react.js
MXN_小南学前端10 小时前
React超长文本域中实现“返回顶部”浮动按钮
前端·javascript·react.js