2013-05-11 93 views
0

請參閱下面的代碼。當請求被髮送並返回OK時,在reqListener()函數中,我得到了我的文本文件輸出的內容。如何使用AJAX請求乾淨地獲取文本文件

但是,當我嘗試稍後返回響應變量時,它仍然未定義,就好像reqListener()還沒有被調用。這可能是由於async=true的說法?

此外,是否有一個更好的方式來獲取響應文本的功能,如果它的請求成功,就像使用閉包?

function load_text_file() 
{ 
    function reqListener() { 
     if (this.readyState == 4 && this.status == 200) 
     { 
       response = this.responseText; 
       console.log(response); 
     } 
    } 

    var response; 
    var oReq = new XMLHttpRequest(); 
    oReq.onreadystatechange = reqListener; 
    oReq.open("get", "file.txt", true); 
    oReq.send(); 
    return response; 
} 

var TEXT = load_text_file(); 
console.log(TEXT); 
+0

問題是,load_text_file()在文件加載前返回。當請求實際完成時,你的函數reqListener被調用。所以,程序流程就像這樣。 (1)請求文件(2)從proc返回,沒有結果,所以響應未定義。 (3)console.log(TEXT) - 響應尚未返回。 (4)請求完成後,console.log(響應)現在具有要顯示的有效數據。 – enhzflep 2013-05-11 11:17:30

+0

AJAX =異步。你的函數在加載前返回。重新考慮你的結構。 – Dave 2013-05-11 11:17:56

+0

我不知道該怎麼做。我不能將'reqListener'的輸出分配給任何東西,因爲我不知道'onreadystatechange'何時會發生。我的意思是,我可以有一個全局變量TEXT,然後將TEXT分配給'reqListener()'中的'reponseText',但是那個函數依賴於一些看起來很糟糕的外部變量。 – njp 2013-05-11 11:50:48

回答

1

該請求需要時間才能完成。你最好交出一個回調文件加載時觸發:

function load_text_file(callback) 
{ 

    function reqListener() { 

     if (this.readyState == 4 && this.status == 200) 
     { 
       console.log(response); 
       callback(this.responseText); 

     } 
    } 


    var oReq = new XMLHttpRequest(); 
    oReq.onreadystatechange = reqListener; 
    oReq.open("get", "file.txt", true); 
    oReq.send(); 
} 

load_text_file(function(){ 
    console.log(TEXT); 
});