2011-07-13 9 views
5

EDITARobjeto JavaScript regresó de función disponible en Chrome Herramientas de desarrollo, pero no desde el guión

que era un poco rápido de ahí, el problema se plantea en la función y no donde por primera vez, dijo. Aquí está la función:

function returnAnObject(url) { 
    var apiurl = 'http://url.com'; 

    var info = {}; 
    $.getJSON(apiurl, function(data) { 
    $.extend(info, { 
     a : data.x, 
     b : data.y, 
     c : data.z 
    }); 
    }); 

    console.log(info); // Shows object as usual 
    console.log(info.a); // Shows undefined 
    return info; 
} 

¿Eso lo hace más claro?

FIN EDITAR

Ok lo tanto, tengo un pequeño problema.

que tienen una función que devuelve un objeto bastante simple, que es como la siguiente:

{ 
    a: 'x', 
    b: 'y', 
    c: 'z' 
} 

lo guardo a una variable de la siguiente manera:

var something = functionThatReturnsObject(someargument); 
console.log(something); // In chrome dev tools, I see the object and its values 
console.log(something.a); // This, however, logs undefined 
console.log(something['a']); // This also logs undefined 

¿Por qué es esto? Creo que me estoy volviendo loco aquí, debo haber pasado por alto algo ...

La parte realmente raro pasa si en lugar de

var something = functionThatReturnsObject(someargument); 

escribo

window.something = functionThatReturnsObject(someargument); 
console.log(something); // Still works, showing the object and properties 
console.log(something.a); // Still doesn't work 
console.log(someting['a']); // Still doesn't work 

Si ahora puedo acceder a la objeto directamente desde las herramientas de desarrollo, ingresando

something; // returns object, I can see everything in it etc. 
something.a // Now, for some mysterious (to me) reason, this works, returning the value of a 

Entonces, ¿alguien entiende lo que está pasando en su ¿mi?

+0

Probablemente tendrá que mostrarnos la función que devuelve el valor y las definiciones reales de las variables para que podamos ver cuál es el problema. Puede ser un problema de alcance que solo podemos ver en tu código real. Las herramientas de desarrollo pueden tener un alcance un poco diferente que su código de ejecución. – jfriend00

+0

@ jfriend00 en realidad tiene usted razón, el problema surge en la función y no en el lugar donde dije primero. Voy a editar la pregunta. – martingms

+0

@ jfriend00 Función ahora agregada – martingms

Respuesta

3

Como sospechaba. Está asignando información en el controlador de éxito para una llamada de función asincrónica. El controlador de éxito no se ejecuta hasta DESPUÉS de que se complete la llamada ajax, pero la función vuelve justo después de que se inicia la llamada ajax (y mucho antes de que finalice y tenga éxito). Puede que no te lo creas, pero esta es la cuarta vez que respondo este mismo tipo de problema hoy. Es un error muy común. Debido al controlador de éxito en línea, parece que todo sucede dentro de la función principal, pero en realidad sucede mucho después de que termina la función.

No puede usar el resultado de retorno de la llamada ajax hasta que se llame al controlador de éxito. Si desea pasar ese resultado al código subsiguiente, tendrá que llamar a ese código posterior desde el controlador de éxito, no continuarlo después de la llamada de función returnAnObject.

Funciona en las herramientas de desarrollo porque la llamada ajax se completa cuando se escribe algo en las herramientas de desarrollo o se mira allí. Pero, info.a no está disponible al final de la función returnAnObject. Solo está disponible cuando se llama al controlador de éxito para la función ajax.

+0

¡Eso parece ser, gracias!Llamar al código subsiguiente del controlador de éxito arruina el flujo de mi aplicación, pero tendré que trabajar de alguna forma ... ¡Gracias de nuevo! – martingms

+0

Las llamadas asincrónicas generalmente dificultan el flujo de la aplicación (su desventaja). Pero, también le permiten hacer otras cosas mientras se están completando (su ventaja). – jfriend00

Cuestiones relacionadas