使用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基本功还不扎实,需要加强练习

相关推荐
福大大架构师每日一题5 分钟前
agno v2.4.7发布!新增Else条件分支、AWS Bedrock重排器、HITL等重大升级全解析
javascript·云计算·aws
.清和.9 分钟前
【js】Javascript事件循环机制
开发语言·javascript·ecmascript
心柠20 分钟前
原型和原型链
开发语言·javascript·ecmascript
东东51643 分钟前
校园短期闲置资源置换平台 ssm+vue
java·前端·javascript·vue.js·毕业设计·毕设
悟能不能悟44 分钟前
VUE的国际化,怎么实现
前端·javascript·vue.js
2601_949480061 小时前
Flutter for OpenHarmony音乐播放器App实战11:创建歌单实现
开发语言·javascript·flutter
Mr Xu_1 小时前
解决 Vue + Axios 热更新导致响应拦截器重复注册的问题
前端·javascript·vue.js
Coder_preston1 小时前
JavaScript学习指南
开发语言·javascript·ecmascript
Jinuss1 小时前
源码分析之React中Scheduler调度器的最小二叉堆
javascript·算法·react.js
a1117761 小时前
电流卡片特效(html网页 开源)
javascript·css·css3