2015-11-08 89 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