2011-05-22 102 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'); 
});