2015-11-08 87 views
2

我有这个XMLHttpRequest并且我想要打印变量contents ...但是外部函数onload变量contents是“”。我如何访问函数外的变量?外部可变外部XMLHttpRequest

var xhr = new XMLHttpRequest(); 
var contents = "" 
xhr.open("GET", fileURL); 
xhr.responseType = "arraybuffer"; 
xhr.onload = function() { 
    if (this.status === 200) { 
     var blob = new Blob([xhr.response], {type: "application/pdf"}); 
     var objectUrl = URL.createObjectURL(blob); 
     alert("sucess") 

     var reader = new FileReader(); 
     reader.readAsBinaryString(blob); 
     reader.onload = function(e) { 
      contents = e.target.result; 
     } 
    } 
    else { 
    alert("insucess"); 
    } 
}; 
xhr.send(); 


console.log(contents); 
+0

这似乎是适用的:http://stackoverflow.com/questions/5485495/how-can-i-take-advantage-of-callback-functions-for-asynchronous-xmlhttprequest – mariocatch

+0

等待异步xhr完成 –

+2

这个问题的一个变体在这里每天会被问到很多次。您的XHR呼叫是异步的。这意味着响应会在其他代码执行后的某个时候发生。因此,只有你可以可靠地使用结果的地方是INSIDE'onload'处理器或者你从那里调用的函数,并将结果传递给。你不能在'console.log()'语句的地方同步使用结果。欢迎来到异步编程的世界。你必须以不同的方式编写代码。看到你的问题被标记为许多其他解释的副本。 – jfriend00

回答

2

更好的选择是与该响应作为回调来执行的功能。

一个简单的例子:

var createXhrRequest = function(httpMethod, url, callback) { 

    var xhr = new XMLHttpRequest(); 
    xhr.open(httpMethod, url); 

    xhr.onload = function() { 
     callback(null, xhr.response); 
    }; 

    xhr.onerror = function() { 
     callback(xhr.response); 
    }; 

    xhr.send(); 

} 

createXhrRequest("GET", fileUrl, function(err, response) { 

    // Do your post processing here. 
    if(err) { console.log("Error!"); } 

    // This is just basic code; you can modify it to suit your needs. 

}); 

记住,使用异步比使用被黑同步方法更好。

编辑1:根据你想要的

这是你不应该做的事情。我得到了你想说的话;为此,您需要同步XMLHttpRequests,这是不可取的。

请记住异步(线程)在PARALLEL线程上的工作方式,因此任何异步活动都将拥有自己的线程,而不是在同一个线程上工作。

但是,我会再次推荐异步请求。一个很好的方法是使用Promises.js库在https://www.promisejs.org/

简而言之,你不能轻松做到这一点。

+0

但我不明白,我怎么能把我的“内容”变量而不是一个函数?我需要这个变量。 – PRVS

+0

但我无法理解如何通过URL读取PDF并在上面的代码中制作所有“响应类型”例如...在此库中:\ – PRVS

+0

任何示例? :\ – PRVS