如何在 XMLHttpRequest.onreadystatechange 回调函数中读取 FileReader.onloadend 中定义的变量值?
How do I read value of variable defined in FileReader.onloadend inside XMLHttpRequest.onreadystatechange callback functin?
在下面的代码中,我需要在函数xhr.onreadystatechange
中读取变量ext
(在函数reader.onloadend
中定义)的值。现在正在返回 undefined
。有什么解决办法吗?
function file_upload(file_input) {
var name = file_input.dataset.target;
var url = file_input.dataset.url;
var path = file_input.dataset.path;
var ext;
for(var i = 0; i<file_input.files.length; i++) {
var file = file_input.files[i];
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var id = xhr.responseText;
var input = document.createElement("input");
input.setAttribute("type", "hidden");
input.setAttribute("name", name);
input.setAttribute("value", id);
document.getElementById("btn_uload_"+name+"_"+ext).append(input);
document.getElementById("empty_file").style.display = 'none';
document.getElementById("single_file_"+ext).style.display = 'block';
}
};
var reader = new FileReader();
reader.onloadend = function() {
var bytes = reader.result;
var ext = file.name.split(".").pop();
var formData = new FormData();
formData.append('bytes', bytes);
formData.append('type', ext);
xhr.send(formData);
}
reader.readAsDataURL(file);
}
}
从 reader 回调中删除 var ext =...
,它只是为该函数创建一个局部变量(它没有设置外部变量。即使您删除了 var
关键字,所以它开始设置外部 ext
变量,您最终会遇到 this q&a
中讨论的问题
将您的赋值移动到循环的顶部(而不是函数的顶部)。并使用 let
而不是 var
这样它是块范围的并且不会 运行 进入前面提到的问题
for(var i = 0; i<file_input.files.length; i++) {
var file = file_input.files[i];
let ext = file.name.split('.').pop();
在下面的代码中,我需要在函数xhr.onreadystatechange
中读取变量ext
(在函数reader.onloadend
中定义)的值。现在正在返回 undefined
。有什么解决办法吗?
function file_upload(file_input) {
var name = file_input.dataset.target;
var url = file_input.dataset.url;
var path = file_input.dataset.path;
var ext;
for(var i = 0; i<file_input.files.length; i++) {
var file = file_input.files[i];
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var id = xhr.responseText;
var input = document.createElement("input");
input.setAttribute("type", "hidden");
input.setAttribute("name", name);
input.setAttribute("value", id);
document.getElementById("btn_uload_"+name+"_"+ext).append(input);
document.getElementById("empty_file").style.display = 'none';
document.getElementById("single_file_"+ext).style.display = 'block';
}
};
var reader = new FileReader();
reader.onloadend = function() {
var bytes = reader.result;
var ext = file.name.split(".").pop();
var formData = new FormData();
formData.append('bytes', bytes);
formData.append('type', ext);
xhr.send(formData);
}
reader.readAsDataURL(file);
}
}
从 reader 回调中删除 var ext =...
,它只是为该函数创建一个局部变量(它没有设置外部变量。即使您删除了 var
关键字,所以它开始设置外部 ext
变量,您最终会遇到 this q&a
将您的赋值移动到循环的顶部(而不是函数的顶部)。并使用 let
而不是 var
这样它是块范围的并且不会 运行 进入前面提到的问题
for(var i = 0; i<file_input.files.length; i++) {
var file = file_input.files[i];
let ext = file.name.split('.').pop();