onload XMLHttpRequest 外部变量
Variable outside onload XMLHttpRequest
我有这个 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);
更好的选择是将响应作为回调来执行函数。
一个简单的例子:
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,这是不可取的。
记住异步(线程)在并行线程上工作的方式,所以任何异步 activity 都会有自己的线程,而不是在同一个线程上工作。
但我再次推荐异步请求。一个很好的方法是使用 https://www.promisejs.org/
上可用的 Promises.js 库
简而言之,您无法轻松做到这一点。
我有这个 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);
更好的选择是将响应作为回调来执行函数。
一个简单的例子:
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,这是不可取的。
记住异步(线程)在并行线程上工作的方式,所以任何异步 activity 都会有自己的线程,而不是在同一个线程上工作。
但我再次推荐异步请求。一个很好的方法是使用 https://www.promisejs.org/
上可用的 Promises.js 库简而言之,您无法轻松做到这一点。