首页 > 解决方案 > 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 数据库。该集合称为事件。在事件中,我有一个以日期为名称的文件,其中我有一些信息。

标签: javascriptnode.js

解决方案


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

您可以使用Array#forEach()代替 for 循环来避免这种行为,并确保每个异步调用都包含在其自己的包含正确索引值的函数块中。


推荐阅读