2013-01-07 104 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

相關問題