变量外部onload XMLHttpRequest

时间:2015-11-08 14:42:17

标签: javascript http get xmlhttprequest httprequest

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

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);

1 个答案:

答案 0 :(得分:3)

更好的选择是执行一个函数,并将响应作为回调。

一个简单的例子:

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.

});

请记住,使用async比使用Hacked-Sync方法更好。

编辑1:根据您的需要

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

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

但是,我再次建议异步请求。一个很好的方法是在https://www.promisejs.org/

使用Promises.js Library

简单来说,你不能轻易做到这一点。