14

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

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

提前致谢。

4

3 回答 3

21

除了您的问题描述非常简洁这一事实之外,问题似乎是您对返回什么的假设。

函数 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 函数都可能以类似的方式运行。如果他们返回一些东西,它不会是传递的回调的返回值。

于 2012-09-29T21:40:55.340 回答
2

如果您从当前的 d3 版本开始,解决方案将不再有效。新解决方案 -> d3.json() 回调中的代码未执行

那么应该是...

d3.json("filename.json")
  .then(function(data){
    console.log(data);
  });
于 2020-03-08T15:11:06.860 回答
0

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

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

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

这样您就可以查看 JSON 文件的处理是否有问题。

于 2017-07-07T07:20:55.750 回答