2012-09-29 8 views
13

Als JQUERY/d3-noob, es scheint, dass ich nicht herausfinden kann, wie diese Arbeit zu machen:Zurückgeben Array von d3.json()

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

Vielen Dank im Voraus.

Antwort

20

Neben der Tatsache, dass Ihre Problembeschreibung sehr knapp ist, scheint das Problem Ihre Annahmen darüber zu sein, was zurückkehrt was.

Die Funktion d3.json() ist eine asynchrone Funktion, die direkt zurückkehrt (mit einem undefinierten Wert, wie ich annehme). Nur wenn die Daten vom Backend empfangen werden, wird die Callback-Funktion aufgerufen, die Sie übergeben haben. Offensichtlich ist der Kontext hier anders und der Rückgabewert Ihres Callbacks wird nicht automatisch zum Rückgabewert von d3.json (da dieser bereits vorher "long" zurückgegeben hat).

Was Sie tun möchten, ist wahrscheinlich so etwas wie:

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

Update 1: Offensichtlich ist das obige Beispiel noch nicht ganz korrekt ist. Der Aufruf von console.log() erfolgt direkt nach der Rückgabe von d3.json(). Daher hat der Server die Antwort möglicherweise noch nicht vollständig gesendet. Daher können Sie nur auf Daten zugreifen, wenn der Rückruf zurückgegeben wird. Festes Beispiel:

var jsondata; 

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

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

Für ein (etwas dumm, aber) Arbeitsbeispiel siehe: http://jsfiddle.net/GhpBt/10/

Update 2: Das obige Beispiel, in dem demonstriert Reihenfolge der Code ausgeführt wird, aber wirklich nicht verdient eine Preis für den schönsten Code. Ich würde mich nicht um dieses „globale“ Variable verwenden und das obige Beispiel vereinfachen:

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

    d3.json(dataPath, doSomethingWithData); 

Beachten Sie, wie doSomethingWithData direkt an Stelle geleitet wird, d3.json davon separat in einer anonymen inneren Funktion aufrufen.

Hinweis: Dies ist kein besonderes Problem von d3.js. Grundsätzlich verhalten sich alle JavaScript-Funktionen, die asynchron sind, wahrscheinlich auf ähnliche Weise. Wenn sie etwas zurückgeben, ist dies nicht der Rückgabewert des übergebenen Callbacks.

+0

danke, aber leider wird dies auch "undefined" zurückgeben. –

+0

Sind Sie sicher, dass Sie tatsächlich ein Ergebnis erhalten? I.e. Könnten Sie versuchen, die console.log() in den Funktionskörper zu stellen (und den dataFromServer dort einzufügen). Ein minimales Beispiel, das das Problem auf jsfiddle.net demonstriert, hilft Ihnen zu verstehen, was Sie gerade tun. –

+0

yep, ein Array ist als Ergebnis innerhalb der Funktion gegeben –

0

Ich bin mir bewusst, dass dies eine sehr alte Post, aber ich habe ein ähnliches Problem vor kurzem, und fand die folgende Lösung gegenüber, die vielleicht es wert:

In meinem Fall der Syntax der JSON-Datei gebrochen wurde . Standardmäßig werden in diesem Fall keine Fehler im Browser angezeigt, es sei denn, Sie erweitern die von @BertjanBroeksema vorgeschlagene Funktion mit Fehlerbehandlung. Etwas wie folgt aus:

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

Auf diese Weise Sie sehen, wenn es etwas falsch mit der Verarbeitung der JSON-Datei war.