2013-05-09 15 views
5

Chcę przechowywać załadowany obiekt JSON w zmiennej. Normalnie powinienem zrobić coś takiego:Jak zapisać obiekt JSON załadowany z pliku?

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

Ale zamiast tego chcę coś takiego:

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

Chcę uzyskać dostęp jsonData poza funkcją d3.json. Jak mogę to zrobić?

Odpowiedz

6

zawsze można użyć jQuery.ajax() synchronicznie:

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

jednak nie jest to zalecane, jak wyjaśniono w jQuery API:

Pierwsza litera w Ajax oznacza „asynchroniczny”, co oznacza, że ​​operacja występuje równolegle, a kolejność ich realizacji nie jest gwarantowana. Opcja async do $ .ajax() domyślnie przyjmuje wartość true, co oznacza, że ​​wykonanie kodu może być kontynuowane po wysłaniu żądania. Ustawienie tej opcji na false (i tym samym uniemożliwienie asynchronicznego wywołania) jest zdecydowanie odradzane, ponieważ może to spowodować, że przeglądarka przestanie odpowiadać.

Funkcja d3.json() jest asynchroniczna. W związku z tym należy poczekać na przesłanie danych przed odczytaniem zmiennej data. To jest powód, dlaczego, gdy mamy do czynienia z danymi asynchronicznych, praktyka jest zrobić wszystko wewnątrz d3.json() funkcję:

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

Uwaga: odpowiedź inspirowany z moim poprzednim odpowiedź tutaj: How to import json data in D3?

5

Według Interactive Data Vis dla sieci autorstwa Scotta Murraya (str. 74), możesz najpierw zadeklarować zmienną globalną. Wewnątrz funkcji wywołania zwrotnego przypisz dane do globalnego var.

var dataset; // global 

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

zbiór danych jes wszystkich kolejnych funkcji

+3

Problem miałem z tej metody jest to, że w przypadku próby uzyskania dostępu 'dataset' natychmiast po wywołaniu' d3.json', może nie wszystkie zostały załadowane a mimo to może prowadzić do błędów – arvi1000