首页 > 解决方案 > 循环中的异步nodejs和promise

问题描述

我在理解循环中的异步 nodejs 和我猜的相关范围时遇到了一些问题。

基本上,我想提取不同的值并将其存储在一个“模板”对象中,我将实现每个循环并存储在一个 Promise 数组中,以便在解决时使用它。

对于这段代码的实际目标来说,这似乎(很多)遥不可及,但我很难理解为什么即使我将索引值传递给函数并在then()中使用, promise变量也只返回每个循环的最后一个元素。

代码 :

(async ()=>{

let tab = ["a","b","c","d"];
let data = { name:"Random Array", data:null, idx:null};
let promise = {};
let promisesArray = [];

for(let i = 0 ; i < tab.length; i++){
 promise = wait(3000).then(()=>{
   let d = data;
   d.data = tab[i];
   d.idx = i;
   d.success = true;
   console.log(d);
   return d;
   });

   promisesArray.push(promise);
}

let fullData = await Promise.all(promisesArray);
console.log(fullData);

})();

function wait(time){
 return new Promise((resolve,reject)=>{
   setTimeout(resolve,time)
 });
}

输出 :

[{ name: 'Random Array', data: 'd', idx: 3, success: true },
 { name: 'Random Array', data: 'd', idx: 3, success: true },
 { name: 'Random Array', data: 'd', idx: 3, success: true },
 { name: 'Random Array', data: 'd', idx: 3, success: true }]

预期输出:

[{ name: 'Random Array', data: 'a', idx: 0, success: true },
 { name: 'Random Array', data: 'b', idx: 1, success: true },
 { name: 'Random Array', data: 'c', idx: 2, success: true },
 { name: 'Random Array', data: 'd', idx: 3, success: true }]

抱歉,如果这是一些琐碎的知识,但到目前为止我还没有找到任何相关信息。在此先感谢您的时间!

标签: node.jsobjectasynchronousreference

解决方案


问题是,你一直在使用同一个data对象,所以这就是为什么你的数组中有 4 个完全相同的对象,这都是由于循环中的这一行:

let d = data;

您只是分配datad,它不会复制data,但现在它们都引用了同一个 data对象。如果你只是将值复制datad你会很好:

const d = { ...data }

// or

const d = { name:"Random Array", data:null, idx:null}

// or 

const getData = () => ({ name:"Random Array", data:null, idx:null})
const d = getData()

希望对你有帮助 <3


推荐阅读