XMLHttpRequest:在 oReq.onload 中创建的访问对象
XMLHttpRequest: Access object created in oReq.onload
我正在使用 XMLHttpRequest 和 sheetjs (https://github.com/SheetJS/js-xlsx) 从 excel 电子表格创建 json 对象。一切都运行良好,除了我正在努力访问 oReq.onload
之外创建的对象。创建 json 对象后,我想将其用作 XMLHttpRequest 下面更多代码的输入对象。
我尝试在 oReq.onload
末尾 return json
并且还尝试将我的附加代码包含在 function (e) {}
中,但是这两个选项都不起作用。如有任何建议,我们将不胜感激。
/* set up XMLHttpRequest */
var url = "graph.xlsx";
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
oReq.onload = function(e) {
var arraybuffer = oReq.response;
/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
/* Call XLSX */
var workbook = XLSX.read(bstr, {type:"binary"});
/* Create the json object */
var json = to_json(workbook);
/*Converts excel format to JSON*/
function to_json(workbook) {
var result = {};
workbook.SheetNames.forEach(function(sheetName) {
var roa = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
if(roa.length > 0){
result[sheetName] = roa;
}
});
return result;
}
};
oReq.send();
/*I WOULD LIKE TO USE THE CREATED JSON OBJECT HERE*/
最终成为@epascarello 所建议的异步问题。可以在post中找到非常全面的解释:Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
希望这还不算太晚,但我遇到了同样的问题。
只需设置一个超时时间,然后等待 onload 函数完成
像这样
setTimeout(function() {
console.log (yourvariable); //prints the variable outside the function
}, 1000);
使用回调您可以在函数外获取数据,如此处所述
function asyncReq(callback){
oReq.onload = function(e) {
var arraybuffer = oReq.response;
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
var workbook = XLSX.read(bstr, {
type: "binary"
});
var sheet_name = workbook.SheetNames[0];
var worksheet = workbook.Sheets[sheet_name];
myJson = XLSX.utils.sheet_to_json(worksheet, {
header: 1
});
callback(myJson);
}
}
oReq.send();
asyncReq(function(result){
//do whatever you want now with the output data
console.log(result);
我正在使用 XMLHttpRequest 和 sheetjs (https://github.com/SheetJS/js-xlsx) 从 excel 电子表格创建 json 对象。一切都运行良好,除了我正在努力访问 oReq.onload
之外创建的对象。创建 json 对象后,我想将其用作 XMLHttpRequest 下面更多代码的输入对象。
我尝试在 oReq.onload
末尾 return json
并且还尝试将我的附加代码包含在 function (e) {}
中,但是这两个选项都不起作用。如有任何建议,我们将不胜感激。
/* set up XMLHttpRequest */
var url = "graph.xlsx";
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
oReq.onload = function(e) {
var arraybuffer = oReq.response;
/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
/* Call XLSX */
var workbook = XLSX.read(bstr, {type:"binary"});
/* Create the json object */
var json = to_json(workbook);
/*Converts excel format to JSON*/
function to_json(workbook) {
var result = {};
workbook.SheetNames.forEach(function(sheetName) {
var roa = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
if(roa.length > 0){
result[sheetName] = roa;
}
});
return result;
}
};
oReq.send();
/*I WOULD LIKE TO USE THE CREATED JSON OBJECT HERE*/
最终成为@epascarello 所建议的异步问题。可以在post中找到非常全面的解释:Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
希望这还不算太晚,但我遇到了同样的问题。 只需设置一个超时时间,然后等待 onload 函数完成 像这样
setTimeout(function() {
console.log (yourvariable); //prints the variable outside the function
}, 1000);
使用回调您可以在函数外获取数据,如此处所述
function asyncReq(callback){
oReq.onload = function(e) {
var arraybuffer = oReq.response;
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
var workbook = XLSX.read(bstr, {
type: "binary"
});
var sheet_name = workbook.SheetNames[0];
var worksheet = workbook.Sheets[sheet_name];
myJson = XLSX.utils.sheet_to_json(worksheet, {
header: 1
});
callback(myJson);
}
}
oReq.send();
asyncReq(function(result){
//do whatever you want now with the output data
console.log(result);