1

yo necesito que los datos del usuario que los estoy obteniendo via ajax usando json y almacenarlos en una variable para así poder usarla fuera del ajax. La variable datosusuario debería almacenar los datos pero cuando los almacenos solo se muestran mientras este dentro del ajax y eso no es lo quiero. Saludos.

var datosusuario;

function getUsuarioSesion(idusuario, url){
    var data = {idusuario:idusuario};
    $.ajax({
        url:url,
        type:'post',
        data:data,
        success:function(e){
            datosusuario = JSON.parse(e);
            /*Estando aqui se me muestran los datos*/
            console.log(datosusuario);
        }
    });
}
/*Pero estando aca dice undefined*/
console.log(datosusuario);
Thovar190
  • 11
  • 2
  • cuando javascript interpreta tu codfigo, en la consola, primero te aparece un undefined y luego tu consulta, funciona con [Promesas](https://es.stackoverflow.com/questions/64265/qu%C3%A9-es-una-promesa-en-javascript) – JackNavaRow Oct 12 '18 at 13:12

2 Answers2

1

Una llamada ajax, se ejecuta de forma asincrónica, por lo cual antes que la variable "datousuario" se llene con la respuesta del ajax, el código debajo de dicha llamada se va a seguir ejecutando sin esperar la respuesta, y cuando se lee la variable, aun está undefined, la unica manera que tenes de poder trabajar con la respuesta del ajax, es a través de las Promises(promesas) de javascript, las promesas representan valores que pueden estar disponibles de inmediato, o no, y en caso de no estar disponible, lo esperan para seguir ejecutándose, siempre y cuando se use en el "then" de la promise, tu caso se resolvería de la siguiente manera:

1: hacemos que getUsuarioSesion sea una promise para que pueda esperarse cuando este listo el resultado:

const getUsuarioSesion = (idUsuario, url) => new Promise((resolve, reject) => {

    const data = { idUsuario };

    $.ajax({
        url,
        type:'post',
        data,
        success: (res) => {
            resolve(JSON.parse(res));
        },
        error: (err) => {
            reject(err);
        }
    });
});

2: cada vez que necesites obtener el dato de usuario (respuesta del ajax), simplemente tenes que llamarlo asi:

getUsuarioSesion()
    .then(datoUsuario => {
        // codigo que quieras usando datoUsuario
        console.log(datoUsuario); 
    })
    .catch(err => {
        // manejo del posible error, en caso que falle el ajax
        console.log(err);
    });

Te dejo info sobre lo que son las promises: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Promise

Alejandro Lariccia
  • 185
  • 1
  • 1
  • 5
0

Actualmente estás en otro tiempo de ejecución, es decir, var datosusuarios; está declarada pero no iniciada por lo tanto undefined en el console.log(datosusuarios)

¿ Porque ?

La llamada a la función se realiza por tu parte, supongo, mediante una acción, es decir, llamas a la función pero el console.log(datosusuario) ya se ha mostrado en la consola.

Las llamadas asíncronas se ejecutan en segundo plano, además, no espera la respuesta, es decir, tú lanzas la petición AJAX y el código sigue ejecutando-se, hasta que recibe la "response" y se para i/o empieza a ejecutar la función interna del success sí ha sido 200 o fail en caso contrario..

Mira el objeto Promise(); lo que permite junto Ajax ;)