NodeJS承诺。然后在完成循环后完成?

时间:2018-04-28 20:23:42

标签: javascript node.js

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

1 个答案:

答案 0 :(得分:1)

这是因为当执行异步调用后的回调时,循环结束,此时i保持值weeks.length-2jweeks[i].days.length-2。< / p>

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