NodeJS 承诺 .那么循环完成后完成?



所以我有这个代码来检查数据库中的日期是否有事件。我想在几周和几天的数组中将 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我使用火堆数据库。 该集合称为事件。 在事件中,我有一个以日期为名称的文档,其中我有一些信息。

这是因为当异步调用执行后的回调时,循环完成,此时i weeks.length-2保存值并jweeks[i].days.length-2

您可以使用 Array#forEach(( 代替 for 循环来避免这种行为,并确保每个异步调用都包装在其自己的功能块中,该功能块具有适当的索引值。

最新更新