javascript - 在 $.getJSON 函数中测试 bool 变量时出现奇怪的结果

标签 javascript jquery ajax json

我遇到了一个问题,我似乎无法解决这个问题,并且由于我在网上找不到此类示例的任何其他示例,因此我(再次)转向了这个优秀的社区。

我不会通过说明该函数(以及许多其他函数)在协同工作时要做的所有事情来使这个问题变得过于复杂,但是,我会说这个函数(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 始终为 false。我无法理解这一点,因为它无论如何都没有超出范围(据我所知)。

此外,我不希望首先使用 console.log 记录文件中的后面几行(在其他 3 行之前),但似乎该函数正在向后执行?我的意思是,我知道这不可能是真的,但这怎么可能呢?我彻底迷失了......

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

显然这里发生了一些我无法理解的事情。

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

1)我可以很好地获取 JSON 数据,并且

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

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;
            }
        }
    });
}

关于javascript - 在 $.getJSON 函数中测试 bool 变量时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14204029/

相关文章:

javascript - 如何处理 AJAX 站点中繁忙的图标?

javascript - 如何捕获浏览器阻止的 XMLHttpRequest?

javascript - 使用 JS 和 Keyup 在 Rails 4 中进行实时搜索

javascript - 如何在 Firefox 中禁用视频的单击和双击控件?

javascript - 键入时搜索 - 突出显示匹配项

javascript - Electron setSize 动画不起作用

javascript - Ajax jQuery 中数据过滤器的功能

javascript - 如何使用 Javascript 删除 Map 中的这种元素?

javascript - 如何连续显示元素,隐藏它们,然后在 jQuery 中重复

javascript - 某些 Javascript 在单个页面上工作,但在通过 Drupal 主题的 javascript 全局加载时不起作用