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.
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.
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.
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.
grazie, ma purtroppo restituirà anche "indefinito". –
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. –
sì, come risultato viene fornita una matrice all'interno della funzione –