2013-05-11 55 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); 
});