Javascript 从d3.json()返回数组

Javascript 从d3.json()返回数组,javascript,d3.js,Javascript,D3.js,作为JQUERY/d3noob,我似乎不知道如何实现这一点: supdog = d3.json(dataPath, function(jsondata){ return jsondata; }) console.log(supdog); 提前感谢。除了您的问题描述非常简洁之外,问题似乎在于您对返回内容的假设 函数d3.json()是一个异步函数,它直接返回(我假设有一个未定义的值)。只有从后端接收数据时,才会调用传递给它的回调函数。显然,这里的上下文不同,回调的返回值不会自

作为JQUERY/d3noob,我似乎不知道如何实现这一点:

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

提前感谢。

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

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

您想要做的可能是:

    var jsondata;
    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
    }
    console.log(jsondata);
更新1: 显然,上面的例子仍然不完全正确。对console.log()的调用直接在返回d3.json()之后进行。因此,服务器可能尚未完全发送回复。因此,您只能在返回回调时访问数据。固定示例:

    var jsondata;

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

    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
      doSomethingWithData();
    })
有关(有点愚蠢,但)工作示例,请参见:

更新2: 上面的示例演示了代码的执行顺序,但对于最漂亮的代码来说,这并不值得付出代价。我本人不会使用此“全局”变量并将上述示例简化为:

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

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


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

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

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

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

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

如果从当前的d3版本开始,解决方案将不再有效。新解决方案->

那一定是

d3.json(“filename.json”)
.then(功能(数据){
控制台日志(数据);
});

您确定您确实得到了结果吗?例如,您是否可以尝试将console.log()放在函数体中(并将dataFromServer放在其中)。另外,在jsfiddle.net上演示这个问题的一个简单示例将有助于理解您到底在做什么。是的,函数中给出了一个数组。让我补充一下,您的第一个代码中有一个小语法错误:d3.json调用缺少右括号。我的名声不好,编辑时只少了几个字符。有时链接会过时或断开,以后就无法继续。你能总结一下链接中提供的信息吗,以防将来无法使用?非常感谢!这是如何现在将变量指定给要对其执行筛选或分析的变量?