2013-05-09 47 views
5

我想将加载的JSON对象存储在变量中。 通常情况下,我应该这样做:如何存储从文件加载的JSON对象?

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

但是,相反,我想是这样的:

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

我要访问jsonDatad3.json功能之外。我怎样才能做到这一点?

回答

6

您可以随时使用jQuery.ajax()同步:

var jsonData; 
$.ajax({ 
    dataType: "json", 
    url: "jsondatafile.json", 
    async: false 
    success: function(data){jsonData = data} 
}); 

但是不推荐在jQuery的API解释说:

Ajax中的第一个字母代表“异步”,这意味着操作并行发生,并且不能保证完成的顺序。 $ .ajax()的异步选项默认为true,表示请求执行后代码执行可以继续。将此选项设置为false(从而使呼叫不再处于异步状态)强烈建议不要,因为这会导致浏览器无响应。

函数d3.json()是异步的。因此,在读取data变量之前,您必须等待接收数据。这就是为什么,异步数据打交道时,这种做法是做d3.json()函数内一切的原因:

d3.json("temp.json", function(data){ 
    //use data here 
}) 
// do not use data anymore 

注:答案从我以前的答案在这里启发:How to import json data in D3?

5

根据交互式数据可见对于Scott Murray的Web(第74页),您可以先声明一个全局变量。在回调函数中,将数据分配给全局变量。

var dataset; // global 

d3.json("file.json", function(data) { 
    dataset = data; 
    //any other functions that depend on data 
}); 

数据集是无济于事所有后续功能

+3

我有这种方法的问题是,如果您尝试访问'了'd3.json'调用后立即dataset',它可能不是所有的都装但这可能会导致错误 – arvi1000 2015-12-08 18:38:36