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

标签 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 行给出了一个异常(exception):

TypeError: Module_BarDataDaily.dataX is undefined

我做错了什么以及如何解决它?

最佳答案

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

如果您想运行一次d3.csv,获取数据并将其保存在其他地方,您可以尝试类似 this 的操作。或thisthis

一般来说:

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

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

关于javascript - 尝试使用模块模式来安全地获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42627268/

相关文章:

javascript - 如何在文本中显示当前行下的内容

javascript - 同步foreach并渲染2个查询结果NODEJS

javascript - 如何根据选择框中的选项值更改视频的 src 值

javascript - 在 d3 时间轴上显示每隔一个刻度标签?

javascript - d3 js 条形图在 mozilla firefox 中不起作用

javascript - 获取 JSON 键的文本值

javascript - While 循环抛出错误 - Javascript

javascript - 在线条动画之后向折线图数据点添加工具提示

angular - d3 中的动画折线图

javascript - 使用 d3.js 添加可扩展栏