作为一个JQUERY / d3-noob,似乎我无法弄清楚如何使这项工作:
supdog = d3.json(dataPath, function(jsondata){
return jsondata;
})
console.log(supdog);
提前致谢。
答案 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文件的处理是否有问题。