Javascript NodeJS承诺。然后在循环完成后完成?
我用这段代码检查数据库中的日期是否有事件。我想将hasEvent设置为true,以周和天为数组。问题是在最后,它记录了同一行4次。它为什么会这样做?我如何着手解决它 这是我目前使用的代码: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
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我的意思是,目前我真的不喜欢承诺的工作方式。他们似乎让一切变得更加困难。也许是因为我不完全理解它们是如何工作的。或者也许他们真的很难相处。