2013-05-09 23 views
5

Desidero memorizzare un oggetto JSON caricato in una variabile. Normalmente dovrebbe fare qualcosa di simile:Come memorizzare un oggetto JSON caricato da un file?

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

Ma, invece, voglio qualcosa di simile:

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

voglio accedere jsonData di fuori della funzione d3.json. Come posso fare questo?

risposta

6

È sempre possibile utilizzare jQuery.ajax() sincrono:

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

Tuttavia non è consigliabile, come spiegato in jQuery API:

La prima lettera di Ajax sta per "asincrono", nel senso che l'operazione si verifica in parallelo e l'ordine di completamento non è garantito. L'opzione asincrona a $ .ajax() è impostata su true, a indicare che l'esecuzione del codice può continuare dopo aver effettuato la richiesta. L'impostazione di questa opzione su false (e quindi rendendo la chiamata non più asincrona) è fortemente sconsigliata, in quanto può causare la mancata risposta del browser.

La funzione d3.json() è asincrona. Pertanto, è necessario attendere la ricezione dei dati prima di leggere la variabile data. Questo è il motivo per cui, quando si tratta di dati asincroni, la pratica è di fare tutto all'interno della funzione d3.json():

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

Nota: risposta ispirata dalla mia precedente risposta qui: How to import json data in D3?

5

Secondo Interactive Data Vis per il Web di Scott Murray (p 74), è possibile prima dichiarare una variabile globale. All'interno della funzione di callback, assegnare i dati alla variabile globale var.

var dataset; // global 

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

dataset è inutilmente a tutte le funzioni successive

+3

Un problema che ho avuto con questo metodo è che se si tenta di accedere 'dataset' subito dopo la chiamata' d3.json', potrebbe non tutti hanno caricato eppure ciò può portare ad errori – arvi1000

Problemi correlati