node.js - 循环中的异步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 }]
抱歉,如果这是一些琐碎的知识,但到目前为止我还没有找到任何相关信息。在此先感谢您的时间!
解决方案
问题是,你一直在使用同一个data
对象,所以这就是为什么你的数组中有 4 个完全相同的对象,这都是由于循环中的这一行:
let d = data;
您只是分配data
给d
,它不会复制data
,但现在它们都引用了同一个 data
对象。如果你只是将值复制data
到d
你会很好:
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
推荐阅读
- reactjs - 为什么我无法输入 html react 输入框?
- esp8266 - 使用 Micropython ESP8266 捕获 ANSI 转义序列响应
- optimization - 是否可以在代码注释中添加 youtube/社交媒体链接?
- python - 从网络侦听器线程中断主 python 线程
- c# - 使用 openxml 编辑文件后,我们发现“filename.xls”中的某些内容存在问题
- javascript - 导出默认函数在 ReactJS 中返回未定义的值
- file-upload - jersey restful 文件上传服务器使用八位字节流,没有 multipart/form-data
- python - 使用 Flask-SQLAlchemy 创建的表,但它们没有显示在 sqlite 命令行(shell)上
- google-sheets - 从具有所有相同跨度名称的网站上抓取
- c - 如何用另一个数字的位按位替换一个数字中的一系列位以增加,而不影响低位?