2011-07-09 112 views
4

有人能告訴我爲什麼這個警報是空的嗎?關於JavaScript可變範圍的問題

var pending_dates = []; 
$.getJSON('/ajax/event-json-output.php', function(data) { 
    $.each(data, function(key, val) { 
    pending_dates.push({'event_date' : val.event_date}); 
    }); 
}); 
alert(pending_dates); 

我無法理解這一點。我是否聲明pending_dates是全局變量,可在每個循環內訪問?如何解決這個問題?

請注意,JSON輸出運行良好。如果我要在getJSON function內聲明待定日期(並在該函數中發出警報),它將起作用,但我需要將數據存儲在getJSON函數之外的數組中。

感謝您的貢獻。

編輯

感謝您的評論此代碼工作:

pending_dates = []; 
    $.getJSON('/ajax/event-json-output.php', function(data) { 
     $.each(data, function(key, val) { 
      pending_dates.push({'event_date' : val.event_date}); 
     }); 
    }).success(function() { alert(pending_dates); }) 

非常感謝你的貢獻!

回答

4

我認爲問題是$.getJSON是一個異步調用 - 它立即返回,然後alert(pending_dates)被調用。

但是,如果發生這種情況,可能尚未收到來自異步調用的響應,因此可能尚未填充pending_dates

這可能是爲什麼它在調用alert(pending_dates)時爲空。

-2

變量在JavaScript中是默認的全局變量 - 其實var實際上引入了範圍。刪除它,看看它是否有幫助。

+0

感謝您的回答,但恐怕沒有用。任何其他想法? – maartenmachiels

+0

變量定義和警報在相同的範圍內,所以這個建議與問題無關。 – jfriend00

-2

AJAX響應更有可能沒有返回任何數據。您可以嘗試將'foo'推到陣列上,並查看警報是否顯示任何不同的內容?

+0

在問題中提到AJAX響應正在返回數據... – HoLyVieR

+0

這不太可能。是的,這是可能的,但所描述的問題是由於ajax調用的異步性質。 – tomfumb

3

在JSON調用完成之前,您的警報正在執行。請記住它異步獲取和處理的JSON,但警報在啓動後立即生效。如果你想要一個警報,那麼你需要在getJSON調用完成時進行。

2

$.getJSON異步工作,這意味着無論您在回調中指定了什麼,最終都會執行,但不能保證在您到達alert('pending_dates')時發生。

您可以通過後
pending_dates.push()向右移動alert('pending_dates')(這將導致一個警報顯示的是檢索每個項目)驗證這一點。

您可以編寫一個函數來開始你只要它可獲取數據的工作:

var pending_dates = []; 
$.getJSON('/ajax/event-json-output.php', function(data) { 
    $.each(data, function(key, val) { 
     pending_dates.push({'event_date' : val.event_date}); 
     doSomething(val.event_date); 
    }); 
}); 

function doSomething(date) { 
    // do something with date 
    // like writing it to the page 
    // or displaying an alert 
} 

有了這個,你就可以用你得到的,因爲它的數據進行工作變得可用。