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