2014-03-13 16 views
0

我對阿賈克斯仍然比較陌生,所以請耐心等待。jQuery.get():如何將數據用於以後的變量?

我使用$.get()從服務器檢索並讀取文本文件。我需要將數據存儲在範圍之外的變量中,以便稍後使用它。

function some_func() { 
    var ex_var = "A"; 
    $.get("test.txt", function(data) { 
     ex_var = data; 
     console.log(ex_var); // Works 
    }); 
    console.log(ex_var); // Does not work 
} 

從閱讀this,我明白爲什麼在範圍之外不起作用。然而,這似乎意味着我需要在$.get()本身的回調中做所有事情,這似乎並不吸引人。有沒有更好的方法來存儲從$.get()的數據,以便它可以在以後使用?

+1

你不能這樣做,因爲$獲得()是異步 –

+0

得到的是異步請求,意味着它不會等待完成請求。更好地使用承諾。或使用jQuery的Ajax和異步應該是假的 – paritosh

+0

可能重複[如何從AJAX調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from- an-ajax-call) –

回答

0

Ajax調用$.get()是異步的(這就是「A」代表的「Ajax」)。因此,調用$.get()只是開始請求遠程資源的過程。然後,其餘代碼繼續執行,包括直接在$.get()調用之後的代碼(這就是爲什麼位於那裏的console.log()不起作用)。然後,稍後,ajax請求的網絡呼叫完成並且遠程資源可用。在那個時候,調用$.get()的完成回調函數並且您的數據可用。

所有使用ajax調用結果的代碼都應該位於該完成處理程序中,或者應該從完成處理程序調用。使用異步ajax調用時,不能編寫同步代碼。使用異步功能時,您必須採用一種新的思維方式。

function some_func() { 
    $.get("test.txt", function(data) { 
     console.log(data); // Works 
     // call some function and pass it the results of the ajax call 
     // this is how you continue your code logic 
     // using the results of the ajax call 
     callSomeFunction(data); 
    }); 
} 

您不想嘗試將數據放入全局變量,因爲您永遠無法獲得正確的時間。來自ajax調用的數據將在未來的不確定時間返回。您應該使用完成處理程序中的數據,當數據實際返回時,您不必擔心時間。

+0

但是就像我剛纔說的那樣,這意味着它只是使$變得更合適。get()成爲「main()」,可以這麼說,而不是用在其他函數中。我只是想知道是否有更多的「更好」的做法,因爲在回調中拋棄程序的所有子程序似乎很奇怪。 – user3064776

+0

@ user3064776 - 這就是異步編程的工作原理。它使用回調。如果將'$ .get()'放在另一個函數中,那麼只需將其他函數傳遞給一個回調函數,該函數將在數據可用時調用。習慣它。這就是異步編程如何工作的時期。如果您願意,可以使用不同類型的異步編程(如承諾),但您仍然會遇到同樣的基本問題。您的代碼必須在回調中的Ajax調用後繼續。 – jfriend00

0

首先,$.get()是異步調用,它使用回調機制來處理響應。所以它不會等到你的文件被加載,而這又不會像你所建議的那樣工作。爲此,您可以在下面的方式,(我沒有測試過)

function some_func() { 
    var ex_var; 
    $.get("test.txt", function(data) { 
    console.log(data); 
    ex_varLoaded(data); 
    }); 
    function ex_varLoaded(data) 
    { 
    console.log(data); // which is nothing but your data loaded through $.get 
    } 
} 
+0

噢,我的天啊。你真的提供了一個輪詢等待數據的解決方案嗎?現在就來 - 不要提供糟糕的編程選項。當數據準備好完成功能時,您會收到一個直接通知。爲了上帝的緣故,使用那個(並且只有那個)。 – jfriend00

+0

@ jfriend00是的,你在這方面是正確的......但我只是試圖擴展所提供的代碼..通過我明白你的觀點。只是更新了我的答案。 – agpt

-1

是否要使用全局變量,它是你的選擇,全局變量是不好的,如果你不知道是什麼原因,你需要閱讀更多。因此,我就如何「稍後使用數據」的具體問題向您提供了幫助,換句話說:

如何從函數範圍外的XHR分配結果?

操作簡單,只需將其指定

<script> 
    function some_func() { 
     var ex_var = "A"; 
     $.get("test.txt", function(data) { 
      ex_var = data; 
      console.log(ex_var); // Works 
     }).done(function() { 
      console.log(ex_var); // Does not work <-- will work now 
     }); 
    }   
</script> 
相關問題