尝试使用模块模式来安全地获取数据

时间:2017-03-06 13:46:15

标签: javascript d3.js

我试图不必使用名为' data'

的全局变量

在我的js文件中,我现在有了这个功能:

var Module_BarDataDaily = (function() {
    var data;
    d3.csv("myData.csv", function(rows) {
        data = rows;
    });
    return {
        dataX: data
    }
})();

我当时(可能错误地)认为我可以通过Module_BarDataDaily.dataX访问此数据 - 所以在后续功能中我执行以下操作:

function TOPbarChart(
    grp, meas, colorChosen) {

    TOPbarData = Module_BarDataDaily.dataX.map(function(d) {  //line 900
        return { ...

控制台然后在以下第900行给出了一个例外:

TypeError: Module_BarDataDaily.dataX is undefined

我做错了什么?我该如何解决?

2 个答案:

答案 0 :(得分:1)

这里的问题是d3.csv是异步的,因此数据的填充时间与访问时间不同。

如果您想运行d3.csv一次,获取数据并将其保存在其他位置,您可以尝试thisthisthis

等内容

一般来说:

// define your module here    
var Module_BarDataDaily = function(data) {
   this.dataX = data; //this.dataX will store the data
   this.process = function(){// do whatever you need afterwards
            console.log(this.dataX);
    }
 };

var process = function(myModule){
   // or use another function to do what you need etc
   console.log(myModule.dataX);
}

// load your csv once and save the data
d3.csv("path/to/your.csv", function(error, data) {
    // after some proper error handling...
    var myModule = new Module_BarDataDaily(data);
    // so then you can do anything after that and 
    // your myModule will have data without calling d3.csv again
    myModule.process();
    //or
    process(myModule);
});

希望这有帮助! 祝你好运!

答案 1 :(得分:0)

我根据mkaran的回答使用了以下内容:

 var Module_BarDataDaily = function(data) {
     this.dataX = data;
 };


 d3.csv("data/BarChart_data.csv", function(error, rows) {
     var myModule = new Module_BarDataDaily(rows);

     var chart = barChart();
     chart.render(myModule.dataX);

     d3.selectAll('input[name="meas"]').on("change", function change() {
         chart.currentMeasure(this.value)
         chart.render(myModule.dataX);
     });

 });