Javascript 从d3.json()返回数组
作为JQUERY/d3noob,我似乎不知道如何实现这一点:Javascript 从d3.json()返回数组,javascript,d3.js,Javascript,D3.js,作为JQUERY/d3noob,我似乎不知道如何实现这一点: supdog = d3.json(dataPath, function(jsondata){ return jsondata; }) console.log(supdog); 提前感谢。除了您的问题描述非常简洁之外,问题似乎在于您对返回内容的假设 函数d3.json()是一个异步函数,它直接返回(我假设有一个未定义的值)。只有从后端接收数据时,才会调用传递给它的回调函数。显然,这里的上下文不同,回调的返回值不会自
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调用缺少右括号。我的名声不好,编辑时只少了几个字符。有时链接会过时或断开,以后就无法继续。你能总结一下链接中提供的信息吗,以防将来无法使用?非常感谢!这是如何现在将变量指定给要对其执行筛选或分析的变量?