2013-04-26 103 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