2010-02-01 13 views
45

Tengo que hacer algo muy simple, pero parece que no hay una manera fácil de hacerlo, hasta donde yo sé. Solo quiero cargar datos JSON desde una fuente remota y almacenarlos en una variable global de Javascript usando jQuery. Aquí es lo que tengo:carga json en la variable

var my_json; 
$.getJSON(my_url, function(json) { 
    var my_json = json; 
}); 

El my_json variable permanece indefinido. Creo que esto es claramente un problema de alcance. Me parece que el método $ .getJSON debe devolver JSON, pero devuelve un objeto XMLHttpRequest. Si hago esto:

request = $.getJSON(my_url); 
my_json = request.responseText.evalJSON(); 

que no funciona porque hasta el == readystate 4, el responseText sigue siendo nula. Parece que tiene que usar la función de devolución de llamada para devolver el texto de respuesta, ya que se dispara en caso de éxito.

¡No puede ser tan difícil! ¿Derecha?

Respuesta

115

Esto lo hará:

var json = (function() { 
    var json = null; 
    $.ajax({ 
     'async': false, 
     'global': false, 
     'url': my_url, 
     'dataType': "json", 
     'success': function (data) { 
      json = data; 
     } 
    }); 
    return json; 
})(); 

La cuestión principal es que $.getJSON se ejecutará de forma asíncrona, por lo que su Javascript progresará más allá de la expresión que lo invoca incluso antes de que se active su devolución de llamada success, por lo que no hay garantías de que su variable capture datos.

Observe en particular la opción 'async': false en la llamada ajax anterior. El manual dice:

Por defecto, todas las peticiones se envían asíncrona (es decir, esto se establece en true por defecto). Si necesita solicitudes sincrónicas, establezca esta opción en falso. Tenga en cuenta que las solicitudes sincrónicas pueden bloquear temporalmente el navegador, deshabilitar cualquier acción mientras la solicitud está activa.

+0

solo para aclarar en mi beneficio: $ .getJSON nunca es una buena opción para las solicitudes de estilo sincrónico, incluso si devuelvo datos a mi variable durante la devolución de llamada exitosa. – user1026169

+0

+1 para obtener información relacionada, pero ¿por qué está haciendo json variable null al inicio de la función. – Manoj

+0

@Manoj Hay 2 razones [1] para que este bloque esté dentro de un método y se llame varias veces. Por lo tanto, esto actualizaría la variable json. Pero si la solicitud de ajax actualizará esto de todos modos ¿cuál es el punto? Bueno, eso es porque ... [2] esta es una convención de codificación en caso de que la solicitud ajax falle, entonces el usuario puede probar si json es nulo. Si es así, entonces se puede suponer que la solicitud ajax falló –

25

bit de código debe decir:

var my_json; 
$.getJSON(my_url, function(json) { 
    my_json = json; 
}); 
+5

+1 no usan 'var' dos veces –

+3

¿cómo afecta esto a evitar el problema mencionado anteriormente asíncrona? – user1026169

+1

Lo más probable es que intentar forzar una llamada ajax sincrónica sea una mala idea, ajax estaba destinado a llamadas asincrónicas. Esta respuesta debe ser la solución deseada para un problema descrito en la pregunta, +1 de mi parte. – Buyuk

0
<input class="pull-right" id="currSpecID" name="currSpecID" value=""> 

    $.get("http://localhost:8080/HIS_API/rest/MriSpecimen/getMaxSpecimenID", function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
    $("#currSpecID").val(data); 
    }); 

enter image description here enter image description here

0

var itens = null; 
 
$.getJSON("yourfile.json", function(data) { 
 
    itens = data; 
 
    itens.forEach(function(item) { 
 
    console.log(item); 
 
    }); 
 
}); 
 
console.log(itens);
<html> 
 
<head> 
 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
 
</head> 
 
<body> 
 
</body> 
 
</html>

+2

Bienvenido al desbordamiento de la pila :-) Las respuestas de solo código no son útiles para la comunidad. Explique por qué su código resuelve el problema. Consulte [respuesta] – JimHawkins

Cuestiones relacionadas