我想将加载的 JSON 对象存储在变量中。通常我应该这样做:
d3.json("jsondatafile.json", function(json){ DO SOMETHING; });
但是,相反,我想要类似的东西:
var jsonData = d3.json("jsondatafile.json");
我想在函数jsonData
之外访问。d3.json
我怎样才能做到这一点?
你总是可以同步使用jQuery.ajax() :
var jsonData;
$.ajax({
dataType: "json",
url: "jsondatafile.json",
async: false
success: function(data){jsonData = data}
});
但是,不建议按照 jQuery API 中的说明进行操作:
Ajax 中的第一个字母代表“异步”,这意味着操作是并行发生的,并且不保证完成的顺序。$.ajax() 的 async 选项默认为 true,表示在发出请求后可以继续执行代码。强烈建议不要将此选项设置为 false(从而使调用不再是异步的),因为它可能导致浏览器无响应。
该函数d3.json()
是异步的。data
因此,在读取变量之前,您必须等待接收到数据。这就是为什么在处理异步数据时,实践是在d3.json()
函数内部做所有事情的原因:
d3.json("temp.json", function(data){
//use data here
})
// do not use data anymore
注意:答案灵感来自我之前的答案:如何在 D3 中导入 json 数据?
根据 Scott Murray 的 Interactive Data Vis for the Web (p 74),您可以首先声明一个全局变量。在回调函数内部,将数据分配给全局变量。
var dataset; // global
d3.json("file.json", function(data) {
dataset = data;
//any other functions that depend on data
});
数据集可用于所有后续功能