1

Estoy en medio de un script de una página html, y lo que necesito es guardar en una variable lo que hay en otra página html. Lo que estoy haciendo es lo siguiente:

... más código...

var datos;
$.get('info/info_registros/','json', function(data){
    datos = data;
});

... más código...
**Aquí necesito utilizar la variable datos con lo que hay en esa otra página.**

Haciendo esto no me guarda nada en la variable datos, que la necesito más adelante en el script para utilizar.

Alguna solución o otra manera de realizar lo que quiero. Muchas gracias de antemano

Esther
  • 87
  • 7
  • Tienes que declarar la variable como global al principio del script. – JDev Jul 10 '18 at 09:25
  • 2
    Posible duplicado de [¿Cómo obtengo un objeto json dentro de una llamada fetch para usarla en otro lugar?](https://es.stackoverflow.com/questions/33612/c%c3%b3mo-obtengo-un-objeto-json-dentro-de-una-llamada-fetch-para-usarla-en-otro-lug) y de https://es.stackoverflow.com/questions/1539/c%C3%B3mo-obtener-la-respuesta-de-una-llamada-ajax-fuera-de-ella – Pablo Lozano Jul 10 '18 at 09:25
  • @PabloLozano, viendo esos enlaces no encuentro solución. Si hago un alert de data imprime muestra el valor de retorno correcto. Por lo tanto es un problema de asíncrono, alguna solución se te ocurre para mi ejemplo, poder utilizar data síncronamente. Gracias. – Esther Jul 10 '18 at 10:05
  • Lo que tienes que hacer es meter el código que usa ese dato en la función de respuesta, esas respuestas te dan la única solución (las dos primeras letras de AJAX son Asynchronous Javascript ...) – Pablo Lozano Jul 10 '18 at 10:19
  • Como dice @PabloLozano las llamadas a Ajax son asíncronas, lo cual significa que no puedes usar el resultado de la llamada fuera del bloque que hace la petición. Si por algún motivo necesitas el dato fuera, puedes pasarlo a otra función. [Aquí hay un ejemplo](https://es.stackoverflow.com/a/133488/29967) en el cual, desde el `done` que recibe la información, ésta se pasa a otra función llamada `viewLibros` – A. Cedano Jul 10 '18 at 12:09
  • si usas algún lenguaje para generar el html, podes incluir los datos directamente – alo Malbarez Jul 11 '18 at 13:02

4 Answers4

1

El problema con el que te estás encontrando es que la petición se hace de manera asíncrona, por lo que cuando obtienes el valor el código que pregunta por el valor ya ha sido ejecutado. Tendrías que introducir el código que deseas ejecutar tras la llamada de la siguiente forma:

var datos;
$.get('info/info_registros/', function(data) {
   datos = data;
   // Código que desees que utilice "datos".
});
1

Si tienes que utilizar los datos sí o sí justo tras el AJAX y no puedes hacerlo en el callback (yo te recomiendo hacerlo ahí realmente) siempre puedes forzar que el AJAX actúe de forma síncrona:

Modo Síncrono

var datos;

$.ajax({
  url: 'info/info_registros/',
  async: false,
  type: 'get',
  success: function (data) {
    datos = data;
  }
});

Modo Callback

$.get('info/info_registros/', function(data) {
   tu_funcion(data);
});
msolefonte
  • 172
  • 11
  • 1
    te cuento que succes y error de ajax ya se encuentran depreciadas, se debe usar done y fail : http://api.jquery.com/jquery.ajax/ – Diego Avila Jul 11 '18 at 13:13
  • @Tegito123 He estado leyendo la documentación y no he visto que lo nombren como deprecated en ningún lugar. Sí que especifica que poner $.ajax({}).error() no debería usarse, y debería de sustituirse por fail, como tú has especificado, pero el uso de funciones de alto nivel como parámetros, específicamente, me sigue pareciendo correcto. Si sabes algo más,coméntamelo. Me gusta estar actualizado. – msolefonte Jul 12 '18 at 09:21
  • 1
    Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are removed as of jQuery 3.0. You can use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead. – Diego Avila Jul 12 '18 at 13:00
  • es en esa parte casi x el final en el link que te envie – Diego Avila Jul 12 '18 at 13:01
  • @Tegito123 ¡Ahora sí! ¡Muchas gracias! Lo intentaré tener en cuenta de ahora en adelante. – msolefonte Jul 12 '18 at 13:40
-1

te sobra el 'json' intenta poner solo esto:

var datos;
$.get('info/info_registros/', function(data){
    datos = data;
});
Jorge Bowen
  • 784
  • 3
  • 6
  • 1
    Esta respuesta no soluciona el problema: la función se ejecuta de manera asíncrona y eso es lo que no controla. – Pablo Lozano Jul 10 '18 at 09:27
-1

Por lo que he leído en los comentarios tienes que tener el código mal estructurado, mi consejo es que si o si lo cambies y lo organices mejor, porque tener un código parado hasta recibir una variable es una chapuza, lo normal es que lo que tengas que ejecutar lo ejecutes cuando te llegue la variable como te ya te han dicho... si por lo que sea es imposible reorganizar el código y si o si tienes que chapucear prueba esto:

var conditionUpdated = data; // aquí deberia de ir una copia de los datos, o bien la comprobación de que estos tengan valor.

function prueba() {
        if(!conditionUpdated) {
            conditionUpdated = data; // actualizas de nuevo la condi
            setTimeout(prueba,30); // ejecutas al poco la función
        }
        else {
            // aquí tu variable ya debería de tener valor, haz algo aquí
        }
    }
 prueba();
SlavisWolf
  • 94
  • 5