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

Javascript NodeJS承诺。然后在循环完成后完成?,javascript,node.js,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.c

我用这段代码检查数据库中的日期是否有事件。我想将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";
            }
        });

    }
}
for(变量i=0;i
它不断回归2018-04-28是真的i 5 j 6
我使用firestore数据库。该集合称为事件。在事件中,我有一个以日期为名称的文档,其中我有一些信息。

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


您可以使用for循环来避免这种行为,并确保每个异步调用都被包装在其自己的函数块中,该函数块包含一个适当的索引值。

对于
i
j
使用
const
而不是
var
,因为var具有(函数范围)所以它会在同步代码完成时保留最后一个值,但是const和let会有(块作用域)是的,我认为它会这样做,但我认为是。然后会取当前的I和J,等待承诺解决后再继续。但表面上并非如此。@RamonRobben:承诺只是提供了一种“管理”异步值的好方法。它们不会改变语言的工作方式(也就是说,它们不会停止执行。如果它们停止了,那么一开始就不需要回调)。@FelixKling我的意思是,目前我真的不喜欢承诺的工作方式。他们似乎让一切变得更加困难。也许是因为我不完全理解它们是如何工作的。或者也许他们真的很难相处。