作为一个 JQUERY/d3-noob,我似乎无法弄清楚如何使这项工作:
supdog = d3.json(dataPath, function(jsondata){
return jsondata;
})
console.log(supdog);
提前致谢。
作为一个 JQUERY/d3-noob,我似乎无法弄清楚如何使这项工作:
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: 显然,上面的例子仍然不完全正确。在 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 函数都可能以类似的方式运行。如果他们返回一些东西,它不会是传递的回调的返回值。
如果您从当前的 d3 版本开始,解决方案将不再有效。新解决方案 -> d3.json() 回调中的代码未执行
那么应该是...
d3.json("filename.json")
.then(function(data){
console.log(data);
});
我知道这是一个非常古老的帖子,但我最近遇到了类似的问题,并找到了以下解决方案,可能值得分享:
在我的例子中,JSON 文件的语法被破坏了。默认情况下,在这种情况下,浏览器中不会弹出任何错误,除非您使用错误处理增强了@BertjanBroeksema 建议的功能。像这样的东西:
function doSomethingWithData(error, jsondata) {
console.log("error:", error)
console.log(jsondata);
}
这样您就可以查看 JSON 文件的处理是否有问题。