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

相关推荐
Keepreal49615 小时前
word文件预览实现
前端·javascript·react.js
郝开15 小时前
5. React中的组件:组件是什么;React定义组件
前端·javascript·react.js
斜向生15 小时前
【JavaScript正则表达式指南】——字符类(集合、范围、预定义字符类)和反向字符类详解
javascript
FuckPatience15 小时前
电脑所有可用的网络接口
前端·javascript·vue.js
前端开发爱好者15 小时前
尤雨溪宣布:Vite 纪录片震撼发布!
前端·javascript·vue.js
北城以北888815 小时前
ES6(二)
前端·javascript·es6
渣哥15 小时前
多环境配置利器:@Profile 在 Spring 项目中的实战价值
javascript·后端·面试
U.2 SSD16 小时前
Echart仪表盘示例
javascript·echarts
qq_18417767716 小时前
前端自动部署项目到服务器
服务器·前端·javascript
Never_Satisfied16 小时前
在JavaScript / HTML / Node.js中,post方式的Content-Type属性的text的三种编码
javascript·node.js·html