【问题标题】:Code working in console but not when loading website代码在控制台中工作,但在加载网站时不工作
【发布时间】:2013-05-28 23:57:57
【问题描述】:

我的代码在console 中工作,但在加载网站时却没有。

function getData() {
    var a = [];
    d3.csv("../csv/master.csv").get(function (error, rows) {
        for (var i = 0; i < rows.length; i++) {
            a.push(rows[i]);
        }
    });
    return a; 
}
a = getData();
alert(a[0].agency);

奇怪的是,变量 a 似乎是由网站加载的,我可以在控制台中调用它,但警报会引发错误。

("Uncaught TypeError: Cannot read property 'agency' of undefined")

但是,当我在控制台中调用完全相同的警报时,它可以正常工作。

有什么想法吗?

谢谢,

乔纳斯

【问题讨论】:

标签: javascript d3.js nvd3.js


【解决方案1】:

d3.csv 方法发出一个异步请求,因此在网站版本中,您尝试访问数据时可能尚未完全加载 csv 文件。您可能应该重新组织您的代码并将依赖于数据的逻辑放在回调函数中。您还可以在数据加载完成时触发一个事件,并让另一个对象监听该事件以开始绘图。

d3.csv('../csv/master.csv', function(error, rows) {
    // The data is available here
    alert(rows[0].agency);
});

docs 中有关d3.csv 的更多信息。

编辑:正如@elclanrs 所指出的,之前的代码未能说明贴出的代码需要重新组织,所以我更新了答案。

【讨论】:

  • 但是你必须在间隔内运行if 语句直到ready==true 否则它会检查一次,它会是假的,并且不会再次检查。正确的方法是重新组织代码以使用异步请求提供的回调。
  • 当然。另一种策略是在数据准备好时触发一个事件,并让另一个对象监听该事件以开始绘图。
  • 感谢您指出这一点,我根据您的建议改进了答案。
  • 谢谢,这就解释了。 Mike Bostock 也让我知道了这篇文章:stackoverflow.com/questions/9491885/csv-to-array-in-d3-js/…
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 2014-04-29
  • 2018-11-06
相关资源
最近更新 更多