2012-09-29 15 views
13

Come jquery/d3-novellino, sembra non riesco a capire come fare questo lavoro:Tornando matrice da d3.json()

supdog = d3.json(dataPath, function(jsondata){ 
    return jsondata; 
    }) 
    console.log(supdog); 

Grazie in anticipo.

risposta

20

Oltre al fatto che la descrizione del problema è molto concisa, il problema sembra essere la tua ipotesi su cosa restituire cosa.

La funzione d3.json() è una funzione asincrona che restituisce direttamente (con un valore indefinito presumo). Solo quando i dati vengono ricevuti dal back-end, verrà richiamata la funzione di callback che hai passato. Ovviamente il contesto è diverso qui e il valore di ritorno della tua callback non diventerà automaticamente il valore di ritorno di d3.json (come questo è già stato restituito "long").

Che cosa si vuole fare è probabilmente qualcosa come:

var jsondata; 
    d3.json(dataPath, function(dataFromServer) { 
     jsondata = dataFromServer; 
    } 
    console.log(jsondata); 

Update 1: Ovviamente, l'esempio di cui sopra non è ancora pienamente corretta. La chiamata a console.log() viene effettuata direttamente dopo il ritorno di d3.json(). Pertanto, il server potrebbe non aver ancora inviato la risposta completamente. Pertanto, è possibile accedere ai dati solo quando viene restituito il callback. Esempio fisso:

var jsondata; 

    function doSomethingWithData() { 
     console.log(jsondata); 
    } 

    d3.json(dataPath, function(dataFromServer) { 
     jsondata = dataFromServer; 
     doSomethingWithData(); 
    }) 

Per una (un po 'stupido, ma) esempio funzionante vedi: http://jsfiddle.net/GhpBt/10/

Aggiornamento 2: L'esempio precedente dimostra in quale ordine viene eseguito il codice, ma non meritano davvero una prezzo per codice più bello. Io stesso non vorrei usare questa variabile "globale" e semplificare l'esempio di cui sopra a:

function doSomethingWithData(jsondata) { 
     console.log(jsondata); 
    } 

    d3.json(dataPath, doSomethingWithData); 

Si noti come doSomethingWithData è direttamente passato a d3.json in vece di chiamare separatamente in una funzione interna anonima.

Nota: Questo non è un problema particolare di d3.js. Fondamentalmente, tutte le funzioni javascript asincrone possono comportarsi in modo simile. Se restituiscono qualcosa, non sarà il valore di ritorno del callback passato.

+0

grazie, ma purtroppo restituirà anche "indefinito". –

+0

Sei sicuro di avere effettivamente un risultato? Cioè potresti provare a mettere console.log() nel corpo della funzione (e mettere lì il dataFromServer). Inoltre, un esempio minimale che dimostri il problema su jsfiddle.net ti aiuterà a capire cosa stai facendo esattamente. –

+0

sì, come risultato viene fornita una matrice all'interno della funzione –

0

Sono consapevole che questo è un post molto vecchio, ma ho affrontato un problema simile di recente, e trovato la soluzione seguente, che potrebbe vale la pena condividere:

Nel mio caso la sintassi del file JSON era rotto . Per impostazione predefinita, in questo caso non si verificano errori nel browser, a meno che non si migliori la funzione suggerita da @BertjanBroeksema con errorhandling. Qualcosa del genere:

function doSomethingWithData(error, jsondata) { 
    console.log("error:", error) 
    console.log(jsondata); 
} 

In questo modo vedrete se c'è qualcosa di sbagliato nell'elaborazione del file JSON.