2013-04-26 52 views
-2

我有下面的代码的问题:jQuery的处理全局变量

var pageviews = [ 
    [1, 0] 
];    

$.get("http://bla..bla", 
    function(res){ 
     pageviews.push([2, res.value]); 
    }, "json"); 

我检查的浏览量变量,但数组不会被更新。我可以在控制台上看到“res.value”。那么问题是什么?

+2

当您检查'pageviews'的价值?我猜测你正在'$ .get'之后执行它。 – 2013-04-26 14:07:12

+3

如果您希望在'$ .get()'调用之后的语句中更新变量,那么这就是您的问题。响应异步返回,因此您的变量将在稍后一段时间才会更新。在事实上的时间 – Pointy 2013-04-26 14:07:48

+2

http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call – 2013-04-26 14:08:04

回答

2

其最有可能的,你在错误的地方检查pageviews阵列。 Liky所有Ajax操作,.get()默认情况下异步工作,这意味着你不能只检查数组.get()电话后,预计该数据已经更新。

逸岸,它不是,因为它需要一段时间的浏览器和网络来完成数据传输。如果立即检查您的阵列,您.push()电话后,我答应如预期的那样阵列更新。

$.get(/* ... */); 
console.log(pageviews); // wrong result, the array was not even touched at this point 

您可能会发现jQuerys隐含承诺对象有帮助,您可以使用它像

$.get(/* ... */).done(function(res) { 
    pageviews.push([2, res.value]); 
    console.log(pageviews); 
}); 

这是相当多的完全相同的像你已经做的,但它的语法可能是在更方便的时尚。 “done()”的事情应该使它非常清楚。

当然,你也可以查询股价(无论何种原因)的那些东西,像

$.get("http://bla..bla", function(res){ 
    pageviews.push([2, res.value]); 
}, "json").done(function() { 
    console.log(pageviews); 
}); 
0

如果您呼叫$.get直后检查pageviews,它会的99%的时间不会有任何变化。这是因为请求是异步的(而不是同步的),这意味着它发生在后台并让Javascript的主线程继续执行。

尝试console.log内的位置:

$.get("http://bla..bla", 
function(res){ 
    pageviews.push([2, res.value]); 
    console.log(pageviews); //<-- This will log the updated value to the console 
}, "json"); 
+0

100%。 – 2013-04-26 14:20:33

+0

虽然确实没有更改的值,但它是异步的,如果主JS线程冻结了足够长的时间,它会在返回该行之前返回结果。不过不太可能,这仍然是可能的。 这种情况,虽然是更不可能,因为没有可能锁定了AJAX请求和JavaScript的下一行之间的主线程精深加工。仍然可能,只是极不可能。 – Turnerj 2013-04-26 14:23:15