JavaScripts无法识别var保存已解析的JSON

时间:2017-08-28 20:01:14

标签: javascript css json ajax justgage

我正在尝试为我们公司使用的各种R / Shiny仪表板的索引页编写一些仪表。该页面只是一系列div,其中包含一些样式,可以导致各种R应用程序。

最近,我们的高管表示很有兴趣看到页面顶部的燃油表样式图表示每个部门的月收入和$目标。

我决定使用JustGage插件来制作量表。我们使用我的主管将这些数据转储到服务器上的JSON文档中的脚本从csv中获取数据。我们正在谈论一个包含6行的JSON文件。非常简单。

我正在使用AJAX XMLHttpRequest,这似乎有效。但是,当我将解析后的数据存储到变量中,然后在我的Gauge参数中引用它时,我得到:

  

(index):182未捕获的ReferenceError:未定义feeData       在(指数):182   (匿名)@(索引):182

在检查窗口中。

该特定行是对包含JSON数据的var的第一个引用。

任何帮助都会......嗯,乐于助人!



< script >
  var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
  var feeData = JSON.parse(this.responseText);
  if (this.readyState == 4 && this.status == 200) {
    var feeData = JSON.parse(this.responseText);
  }
};
xhttp.open("GET", "test.json", true);
xhttp.send();
var g = new JustGage({
  titleFontColor: "black",
  labelFontColor: "black",
  id: "DEF",
  value: feeData.DEFCurrent,
  pointer: true,
  min: 0,
  max: feeData.DEFGoal,
  title: "DEF"
});
var g = new JustGage({
  titleFontColor: "black",
  labelFontColor: "black",
  id: "EBO",
  value: feeData.EBOCurrent,
  pointer: true,
  min: 0,
  max: feeData.EBOGoal,
  title: "EBO"
});
var g = new JustGage({
  titleFontColor: "black",
  labelFontColor: "black",
  id: "Company",
  value: (feeData.EBOCurrent + feeData.DEFCurrent),
  pointer: true,
  min: 0,
  max: (feeData.EBOGoal + feeData.DEFGoal),
  title: "Company"
});
var g = new JustGage({
  titleFontColor: "black",
  labelFontColor: "black",
  id: "Legal",
  value: feeData.LegalCurrent,
  pointer: true,
  min: 0,
  max: feeData.LegalGoal,
  title: "Legal"
}); 
</script>
&#13;
&#13;
&#13;

这是JSON文件

{"EBOGoal":1000,"EBOCurrent":900,"DEFGoal":2000,"DEFCurrent":1500,"LegalGoal":500,"LegalCurrent":450}

值得一提的是,当我为量表的js代码的MAX和VALUE参数交换虚拟数值时,量表本身可以正常工作。

1 个答案:

答案 0 :(得分:2)

您有变量声明问题以及计时问题。即使您通过将变量移出onreadystatechange函数范围来解决问题,您的代码也会被破坏,因为数据是异步填充的,而其余代码是同步处理的。我建议您将JustGage初始化移动到一个函数中,并在feeData可用时调用该函数:

xhttp.onreadystatechange = function() {
  var feeData = JSON.parse(this.responseText);
  if (this.readyState == 4 && this.status == 200) {
    // call your function with the data
    setupJustGage(JSON.parse(this.responseText));
  }
};

function setupJustGage(feeData) {
    ...
    var g = new JustGage({
      titleFontColor: "black",
      labelFontColor: "black",
      id: "DEF",
      value: feeData.DEFCurrent,
      pointer: true,
      min: 0,
      max: feeData.DEFGoal,
      title: "DEF"
    });
    var g = new JustGage({
      titleFontColor: "black",
      labelFontColor: "black",
      id: "EBO",
      value: feeData.EBOCurrent,
      pointer: true,
      min: 0,
      max: feeData.EBOGoal,
      title: "EBO"
    });
    ...
}

您还可以将XHR请求包装在一个返回Promise的函数中,并在then中运行其余的设置代码:

function getData() {
    return new Promise(function(resolve) {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
          var feeData = JSON.parse(this.responseText);
          if (this.readyState == 4 && this.status == 200) {
            resolve(JSON.parse(this.responseText));
          }
        };
        xhttp.open("GET", "test.json", true);
        xhttp.send();
    })
}

getData().then(function(feeData) {
   var g = ...
})