Javascript 在$.getJSON函数中测试布尔变量时出现奇数结果

Javascript 在$.getJSON函数中测试布尔变量时出现奇数结果,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我有一个问题,我似乎无法集中我的大脑,因为我在网上找不到任何类似的例子,我(再次)转向了这个优秀的社区 我不会将这个问题过分复杂化,因为我会说明这个函数(以及许多其他函数)在一起工作时所要做的一切,但是,我会说这个函数(eventDayPlotter)在一个月的每一天都会重复。我不理解以下代码片段中包含的结果 function eventDayPlotter(day, gridMod, monthAdjust) { //Beginning of event day plotting.

我有一个问题,我似乎无法集中我的大脑,因为我在网上找不到任何类似的例子,我(再次)转向了这个优秀的社区

我不会将这个问题过分复杂化,因为我会说明这个函数(以及许多其他函数)在一起工作时所要做的一切,但是,我会说这个函数(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")
    }
}
我确实希望第一个if分支执行3次,但是,正如您所看到的,一旦诊断if分支(带有console.logs的分支)在$.getJSON函数之外(逻辑上需要的地方,一旦它们包含有意义的内容),isAnEvent总是false。我不能理解这一点,因为(据我所知)它在任何方面都没有超出范围

另外,我不希望文件中后面的几行先用console.log记录(在其他3行之前),但是这个函数似乎是在向后执行?我是说,我知道这不可能是真的,但这怎么可能呢?我完全不知所措

当在第一个if分支内或其外部(仍然在.getJSON函数内)测试isAnEvent时,它的值并不总是它应该的值(因为这不是它们逻辑上需要去的地方),但它也不总是false,但是,一旦在.getJSON函数外部,它总是false,即使它刚刚变为true

很明显,这里发生了一些我无法理解的事情

最后,如果不明显,有三件事:

1) 我很好地抓取了JSON数据

2) 如果json文件中的任何日期与该日期匹配,则第一个if分支应将isAnvent设置为true。然后下次调用eventDayPlotter时,它应该将IsAnvent重置为false,并以相同的方式测试下一个日期(通过参数传入)

3) 控制台中没有显示脚本错误

如果需要更多信息,请告诉我。

getJSON()
是异步的。这意味着它将在
eventDayPlotter()
完成后一段时间完成并调用其completion函数

因此,您只能在完成函数内测试
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;
            }
        }
    });
}
函数eventDayPlotter(日、gridMod、monthAdjust)
{
//事件日绘图的开始。
isAnEvent=假;
$.getJSON(“/JsonControl/Events.json”),函数(jsonObj)
{
对于(var i=0;i
getJSON()
是异步的。这意味着它将在
eventDayPlotter()
完成后一段时间完成并调用其completion函数

因此,您只能在完成函数内测试
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;
            }
        }
    });
}
函数eventDayPlotter(日、gridMod、monthAdjust)
{
//事件日绘图的开始。
isAnEvent=假;
$.getJSON(“/JsonControl/Events.json”),函数(jsonObj)
{
对于(var i=0;i
$。getJSON
是异步的!将日志记录放在回调中,因为Ajax是异步的。遵循$的代码。getJSON不会等待它完成。顺便说一句,您的事件处理程序缺少用于保存i值的闭包,您的事件处理程序只会在mousedown上显示最后一个事件。我也很想知道,但到目前为止还没有测试。我想那也会是错误的。我讨厌这段代码最初的编写方式。这是一个逻辑混乱。我怎么能记住{I}当时是什么呢?
$。getJSON
是异步的!将日志记录放在回调中,因为Ajax是异步的。遵循$的代码。getJSON不会等待它完成。顺便说一句,您的事件处理程序缺少用于保存i值的闭包,您的事件处理程序只会在mousedown上显示最后一个事件。我也很想知道,但到目前为止还没有测试。我相信