2011-05-22 54 views
3

我與jQuery的Ajax的工作,但在我來說,我需要存儲在全局變量的響應:jQuery.get()變量的作用域

var points = Array() 
$.get("/data", {"id": 1}, function(data) { 
    for (var i=0; i < data.length; i++) { 
     points[data[i].someid] = data[i]; 
    } 
alert(points[22].someid.toString()); // it works fine 
}); 

alert(points[22].someid.toString()); // undefined 

然而,當我嘗試訪問外部的變量點$ .get()的範圍我只是得到一個未定義的對象。但是我在$ .get()中獲得正確的對象。

在這種情況下管理上下文和範圍的最佳方式/標準是什麼?

+0

可能的複製http://stackoverflow.com/questions/6009206/what-is-ajax-and-how - 工作 - – Raynos 2011-05-22 01:45:01

+3

我沒有時間寫出適當的響應,但基本上''.get'回調中的代碼可能尚未執行(因此變量未定義),因爲它是異步 - 這意味着它可以在腳本繼續執行時在稍後未確定的時間點運行。 – 2011-05-22 01:46:02

+0

@Sanchez所以我應該使用**成功**和$ .ajax()來代替? – ccarpenterg 2011-05-22 01:49:56

回答

2

您的範圍很好,但$.get()異步運行。它開始呼叫,然後立即執行第二次警報。當$.get()完成時,它會執行function(data){}。無論你將要使用什麼,你都需要在那裏做。如果你在這一切結束後轉到螢火蟲控制檯,你會發現alert(points[22].someid.toString())具有你所期望的。


您可以禁用您的代碼元素,以阻止進一步的用戶動作:的

var points = Array(); 

// prevent further user action 
$('#actionButton').attr('disabled', true); 
// optionally show a loading.gif to let them know the browser is busy 

$.get("/data", {"id": 1}, function(data) { 
    for (var i=0; i < data.length; i++) { 
     points[data[i].someid] = data[i]; 
    } 
    alert(points[22].someid.toString()); // it works fine 

    // process points data 

    // hide loading.gif 
    // re-enable user action 
    $('#actionButton').removeAttr('disabled'); 
});