javascript - NodeJS 承诺 .then 在循环完成后完成?
问题描述
所以我有这段代码来检查数据库中的日期是否有事件。我想在几周和几天的数组中将 hasEvent 设置为 true。问题是最后它记录了同一行 4 次。为什么它会这样做,我该如何解决它?
这是我目前使用的代码:
for (var i = 0; i < weeks.length-1; i++) {
for (var j = 0; j < weeks[i].days.length-1; j++) {
var datum = weeks[i].days[j];
db.collection('events').doc(datum.year + "-" + datum.month + "-" + datum.day).get().then(function(doc) {
if (doc.exists) {
console.log(datum.year + "-" + datum.month + "-" + datum.day + " is true" + " i " + i + " j " + j);
weeks[i].days[j].hasEvent = "true";
}else{
weeks[i].days[j].hasEvent = "false";
}
});
}
}
它不断返回2018-04-28 是真的 i 5 j 6 我使用 firestore 数据库。该集合称为事件。在事件中,我有一个以日期为名称的文件,其中我有一些信息。
解决方案
这是因为当执行异步调用后的回调时,循环完成,此时i
保存 valueweeks.length-2
和j
value weeks[i].days.length-2
。
您可以使用Array#forEach()代替 for 循环来避免这种行为,并确保每个异步调用都包含在其自己的包含正确索引值的函数块中。
推荐阅读
- javascript - 在打字稿中使用猫鼬填充查询
- python - 将类属性定义为实例变量的默认值是否习惯用法
- azure - SendGrid 和 Arm 模板
- javascript - 函数参数未定义
- java - 无法理解/定位 Octave 到 Java 数组转换所需的 Jar 文件(JIDT 包)
- angular - StackBlitz 无法找到现有的 Angular SCSS 文件
- python - 'str' 对象没有属性 'find_all' 美丽的汤
- eclipse - 未能执行目标 com.google.appengine:appengine-maven-plugin:1.9.67:devserver
- python - How to create a recursive linked node insertion sort algorithm?
- java - Java minecraft 服务器无法在 linux 虚拟服务器机器上的 IPv4 上运行/侦听