将数据从d3 CSV解析请求返回到代码正文

时间:2016-02-14 16:45:19

标签: javascript csv d3.js

我已经浏览了多个页面和示例,这对我来说不起作用,所以我可能做了一些非常明显错误的事情,但不能为我的生活弄清楚:

d3.csv("example.csv", function(d) {
  return {
    year: new Date(+d.Year, 0, 1), // convert "Year" column to Date
    make: d.Make,
    model: d.Model,
    length: +d.Length // convert "Length" column to number
  };
}, function(error, rows) {
  console.log(rows);
});

点击“功能(错误,行)”后,我的行记录得很好并且已成功加载。所以我试着做了

var dataset = d3.csv(etc etc

将console.log更改为

return rows;

或将console.log更改为

dataset = rows;

然而,在请求之后它无法正常工作,我无法访问数据。

1 个答案:

答案 0 :(得分:0)

d3.csv不会返回数据供您分配,因为您正在尝试这样做。原因是d3.csv是异步函数。

异步函数不返回其结果。实际上,异步函数通常对应于可能很长的操作(就像在这种情况下加载可能很大的csv文件一样)。如果函数仅在操作结束后才返回,那么它可以返回结果,浏览器将等待操作而无法对任何其他用户输入作出反应(想象在等待时无法滚动) downlad a file!)

异步函数提供结果的一种常见方法是通过回调:作为参数传递的函数,当结果可用时将调用该函数,并将此结果作为参数。您已经在使用此回调:这是执行日志记录的功能。

因此,您的解决方案是将所有使用数据集的代码放在该回调中。像那样:

d3.csv("example.csv", function(d) {
  return {
    year: new Date(+d.Year, 0, 1), // convert "Year" column to Date
    make: d.Make,
    model: d.Model,
    length: +d.Length // convert "Length" column to number
  };
}, function(error, dataset) {
  // put here the code that makes use the dataset
  // e.g. drawing a graph, or showing a table

  // you won't be able to use dataset out of this function!
});