2012-09-29 11 views
13

Como/d3-novato JQUERY, parece que no puedo encontrar la manera de hacer este trabajo:devuelve matriz de d3.json()

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

Gracias de antemano.

Respuesta

20

Además del hecho de que la descripción de su problema es muy escueta, el problema parece ser su suposición sobre qué devuelve qué.

La función d3.json() es una función asíncrona que devuelve directamente (con un valor indefinido, supongo). Solo cuando se reciban los datos del servidor, se invocará la función de devolución de llamada que le pasó. Obviamente, aquí el contexto es diferente y el valor de retorno de su devolución de llamada no se convertirá automáticamente en el valor de retorno de d3.json (ya que este ya ha devuelto "largo").

Lo que se quiere hacer es probablemente algo como:

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

Actualización 1: Obviamente, el ejemplo anterior todavía no es totalmente correcto. La llamada a console.log() se realiza directamente después de la devolución de d3.json(). Por lo tanto, es posible que el servidor aún no haya enviado la respuesta por completo. Por lo tanto, solo puede acceder a los datos cuando se devuelve la devolución de llamada. ejemplo fija:

var jsondata; 

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

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

Para una (un poco tonto, pero) ejemplo de trabajo ver: http://jsfiddle.net/GhpBt/10/

Actualización 2: El ejemplo anterior muestra el orden en que se ejecuta el código, pero en realidad no merecen una precio por el código más hermoso. Yo mismo no usaría esta variable "global" y simplificar el ejemplo anterior para:

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

    d3.json(dataPath, doSomethingWithData); 

Nota cómo doSomethingWithData se pasa directamente a d3.json en lugar de llamarlo por separado en una función interna anónima.

Nota: Esto no es un problema particular de d3.js. Básicamente, todas las funciones de javascript que son asíncronas probablemente se comporten de forma similar. Si devuelven algo, no será el valor de retorno de la devolución de llamada aprobada.

+0

gracias, pero desafortunadamente esto también volverá "indefinido". –

+0

¿Estás seguro de que realmente obtienes un resultado? Es decir. ¿Podría tratar de poner console.log() en el cuerpo de la función (y poner el dataFromServer allí). Además, un ejemplo mínimo que demuestre el problema en jsfiddle.net ayudará a comprender lo que está haciendo exactamente. –

+0

sí, una matriz se da como resultado dentro de la función –

0

Soy consciente de que este es un post muy antiguo, pero me he enfrentado a un problema similar hace poco tiempo, y se encontró la siguiente solución, que podría vale la pena compartir:

En mi caso la sintaxis del archivo JSON se rompió . De forma predeterminada, no aparecen errores en el navegador en este caso, a menos que mejore la función sugerida por @BertjanBroeksema con el manejo de errores. Algo como esto:

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

De esta manera verás si hubo algún problema con el procesamiento del archivo JSON.