【问题标题】:Variable outside onload XMLHttpRequest [duplicate]onload XMLHttpRequest 之外的变量[重复]
【发布时间】:2016-02-09 06:36:05
【问题描述】:

我有这个 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);

【问题讨论】:

  • 等待异步 xhr 完成
  • 这里每天都会多次询问这个问题的变体。您的 XHR 调用是异步的。这意味着响应发生在您的其余代码执行之后的某个时间。因此,您可以可靠地使用结果的唯一位置是在 onload 处理程序内部或您从那里调用并将结果传递给的函数中。您不能在 console.log() 语句所在的位置同步使用结果。欢迎来到异步编程的世界。您必须以不同的方式编写代码。请参阅标记为重复的问题以了解许多其他解释。

标签: javascript http get xmlhttprequest httprequest


【解决方案1】:

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

一个简单的例子:

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.

});

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

编辑 1:根据您的需要

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

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

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

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

【讨论】:

  • 但我不明白,我怎样才能把我的“内容”变量而不是函数?我需要这个变量。
  • 但我无法理解如何通过 URL 阅读 PDF 并在上面的代码中生成所有“响应类型”...在这个库中:\
  • 您可以像以前一样解析响应。这只是样板。在函数中添加所需的所有属性,然后访问 PDF 作为响应。明白了,还是仍然困惑?
  • 仍然令人困惑! :S 但是你的例子呢?我可以把响应放在一个变量上吗?我很困惑。我的问题只是“放在变量上”:S 你的例子我不知道我该怎么做。
  • 您将无法访问该变量,因为这是一个异步调用。有一些方法,但它们效率极低,有时不起作用。 :\
猜你喜欢
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多