我遇到了一个问题,我似乎无法将自己的大脑包裹起来,而且由于我在网上找不到任何其他这类例子,我已经(再一次)转向这个优秀的社区。
我不会通过陈述此函数(和许多其他函数)在协同工作时所做的一切来复杂化这个问题,但是,我会说这个函数(eventDayPlotter)会在每个月的每一天重复出现。我不理解以下代码段中包含的结果。
function eventDayPlotter(day, gridMod, monthAdjust)
{
//Beginning of event day plotting.
isAnEvent = false;
$.getJSON("/JsonControl/Events.json", function (jsonObj)
{
for (var i = 0; i < jsonObj.events.length; ++i)
{
if(day == jsonObj.events[i].dateNumber && (navDate.getMonth() + monthAdjust) == (jsonObj.events[i].dateMonth -1) && navDate.getFullYear() == jsonObj.events[i].dateYear)
{
document.getElementById("cGrid" + gridMod).className="eventDay";
console.log(jsonObj.events[i].title)
document.getElementById("cGrid" + gridMod).onmousedown = function(){document.getElementById("eventBox").src="/Event htms/Event.htm"; document.getElementById("eventBox").document.getElementById("title").innerHTML = jsonObj.events[i].title;}
isAnEvent = true;
}
}
});
if(isAnEvent == true)
{
console.log("true")
}
if(isAnEvent == false)
{
console.log("false")
}
}
console.log的结果(完整)
33false _main.js:1708
Okmulgee Public Schools County Professional Day _main.js:1696
Okmulgee Public Schools Starts 3rd Quarter _main.js:1696
Okmulgee Public Schools-Closed in Observance of Martin Luther King Jr. Holiday
我希望第一个if分支执行3次,然而,正如你所看到的那样,一旦诊断if分支(带有console.logs的分支)在$ .getJSON之外函数(逻辑上需要它们,一旦它们包含有意义的内容)isAnEvent总是错误的。我无法理解,因为它不以任何方式超出范围(据我所知)。
另外,我不希望文件中的后面的行首先用console.log记录(在其他3行之前),但是看起来这个函数正在向后执行?我的意思是,我知道这不可能是真的,但这怎么可能呢?我完全失去了......
当在第一个if分支内或在其外部(仍然在.getJSON函数内)测试isAnEvent时,它的值并不总是它应该是什么(因为那不是他们需要在逻辑上去的地方),但它不是' t总是假的,但是,一旦在.getJSON函数之外,它总是假的,即使它刚刚变为真。
显然,这里有一些我无法理解的事情。
最后,如果不明显,有3件事:
1)我正好抓住JSON数据,
2)如果json文件中的任何日期与该日期匹配,则第一个if分支应该将isAnEvent设置为true。然后在下次调用eventDayPlotter时,它应该将isAnEvent重置为false并以相同的方式测试下一个日期(通过参数传入)。
3)控制台中没有显示脚本错误。
如果需要更多信息,请与我们联系。
答案 0 :(得分:3)
getJSON()
是异步的。这意味着它完成并在eventDayPlotter()
完成后的某个时间调用它的完成函数。
因此,您只能在完成函数内测试isAnEvent
的值。您无法在eventDayPlotter()
结束时测试它的值。
仅供参考,您可以通过在自动执行的函数闭包中捕获它来修复事件处理程序中i
的值:
function eventDayPlotter(day, gridMod, monthAdjust)
{
//Beginning of event day plotting.
isAnEvent = false;
$.getJSON("/JsonControl/Events.json", function (jsonObj)
{
for (var i = 0; i < jsonObj.events.length; ++i)
{
if(day == jsonObj.events[i].dateNumber && (navDate.getMonth() + monthAdjust) == (jsonObj.events[i].dateMonth -1) && navDate.getFullYear() == jsonObj.events[i].dateYear)
{
document.getElementById("cGrid" + gridMod).className="eventDay";
console.log(jsonObj.events[i].title)
(function(index) {
document.getElementById("cGrid" + gridMod).onmousedown = function(){document.getElementById("eventBox").src="/Event htms/Event.htm"; document.getElementById("eventBox").document.getElementById("title").innerHTML = jsonObj.events[index].title;}
})(i);
isAnEvent = true;
}
}
});
}