2013-01-07 35 views
0

我遇到了一个问题我似乎无法将我的大脑包裹起来,而且我也找不到任何其他这类在线示例, (再一次)这个美好的社区。

我不会通过陈述这个函数(和许多其他函数)在设计时一起工作时所做的所有事情来复杂化这个问题,但是,我会说这个函数(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次,但它是,因为你可以看到,如果分支(具有console.logs的分支)在$ .getJSON函数之外(一旦它们包含有意义的内容,它们在逻辑上需要成为它们)时,诊断一旦isAnEvent总是为false。我无法理解,因为它不以任何方式超出范围(据我所知)。

此外,我不希望文件中的后面的行先用console.log记录(在其他3行之前),但是看起来这个函数是向后执行的?我的意思是,我知道这不可能是真的,但这怎么可能呢?我在一个彻底的损失......

当在第一个if分支或其外部测试isAnEvent(仍在.getJSON函数中)时,它的值并不总是它应该是的(因为这不是它们的位置需要在逻辑上去),但它并不总是假的,但是,一旦.getJSON函数之外,它总是假的,即使它刚刚变为真。

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

最后,在情况下,它并不明显,3件事情:

1)我抓住了JSON数据蛮好的,

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

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

如果需要更多信息,请让我知道。

+0

'$ .getJSON'是** **异步! – Bergi

+1

AJAX是异步的。 “$ .getJSON”后面的代码不会等待它完成。 – jbabey

+0

@所有的O ... I ... C。 – VoidKing

回答

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

我明白了,没有办法让它等待,是吗? – VoidKing

+0

@VoidKing - AJAX中的“A”代表异步。有时候有些方法可以使它同步(所以它会等待完成),但是不建议这样做,因为它们在请求期间锁定了浏览器并且通常是不好的用户体验。 – jfriend00

+0

是啊,是的,我很笨,你不必擦它,哈哈,j/k – VoidKing

相关问题