从d3.json()返回数组

时间:2012-09-29 21:21:18

标签: javascript d3.js

作为一个JQUERY / d3-noob,似乎我无法弄清楚如何使这项工作:

  supdog = d3.json(dataPath, function(jsondata){
    return jsondata;
  })
  console.log(supdog);

提前致谢。

3 个答案:

答案 0 :(得分:20)

除了您的问题描述非常简洁之外,问题似乎是您对返回内容的假设。

函数d3.json()是一个直接返回的异步函数(我假设一个未定义的值)。只有从后端接收数据时,才会调用传递给它的回调函数。显然,这里的上下文不同,你的回调的返回值不会自动成为d3.json的返回值(因为这个已经返回“long”)。

你想做的事情可能是:

    var jsondata;
    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
    }
    console.log(jsondata);

更新1: 显然,上面的例子仍然不完全正确。在返回d3.json()之后直接调用console.log()。因此,服务器可能尚未完全发送回复。因此,您只能在返回回调时访问数据。修复示例:

    var jsondata;

    function doSomethingWithData() {
      console.log(jsondata);
    }

    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
      doSomethingWithData();
    })

对于(有点愚蠢但是)工作示例,请参阅:http://jsfiddle.net/GhpBt/10/

更新2: 上面的例子演示了代码执行的顺序,但实际上并不值得为大多数漂亮的代码付出代价。我自己不会使用这个“全局”变量并将上面的例子简化为:

    function doSomethingWithData(jsondata) {
      console.log(jsondata);
    }

    d3.json(dataPath, doSomethingWithData);

注意doSomethingWithData如何直接传递给d3.json而不是在匿名内部函数中单独调用它。

注意:这不是d3.js的特殊问题。基本上,所有异步的javascript函数都可能以类似的方式运行。如果它们返回某些内容,则它不会是传递的回调的返回值。

答案 1 :(得分:1)

如果从当前的d3版本开始,解决方案将不再起作用。新解决方案-> Code within d3.json() callback is not executed

那一定是...

d3.json("filename.json")
  .then(function(data){
    console.log(data);
  });

答案 2 :(得分:0)

我知道这是一篇非常古老的帖子,但我最近遇到了类似的问题,并找到了以下可能值得分享的解决方案:

在我的情况下,JSON文件的语法被破坏了。默认情况下,在这种情况下浏览器中不会弹出任何错误,除非您通过错误处理增强@BertjanBroeksema建议的功能。像这样:

function doSomethingWithData(error, jsondata) {
  console.log("error:", error)
  console.log(jsondata);
}

通过这种方式,您可以查看JSON文件的处理是否有问题。