6

我想将加载的 JSON 对象存储在变量中。通常我应该这样做:

d3.json("jsondatafile.json", function(json){ DO SOMETHING; });

但是,相反,我想要类似的东西:

var jsonData = d3.json("jsondatafile.json");

我想在函数jsonData之外访问。d3.json我怎样才能做到这一点?

4

2 回答 2

6

你总是可以同步使用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 数据?

于 2013-05-09T05:47:05.120 回答
5

根据 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
});

数据集可用于所有后续功能

于 2014-09-02T17:55:36.447 回答