es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La promesa de Javascript no se resuelve sin un punto de interrupción en el navegador.

Estoy intentando obtener un objeto de una API REST utilizando una Promesa de javascript. El problema con el que me estoy encontrando es que la promesa no se resolverá a menos que esté depurando y use un punto de interrupción. Sé que hay varias preguntas publicadas con respecto a este problema, pero ninguna parece proporcionar una respuesta, así que estoy intentando de nuevo. Aquí está mi código (NOTA: colocar un punto de interrupción en “return values” hace que la promesa llene el objeto de valores TODAS LAS VECES. Sin el punto de interrupción, el objeto NUNCA se llena).

function GetSession(userClient, userId) {

  var user = { userId: '', name: ''};

  userClient.session.get(userId)
    .then(function(result) {
      user.userId = result.userId;
      user.name = result.name;
    })
    .catch(err => alert(err));

  return user;
}

¿Alguien tiene alguna idea de por qué esto falla cuando no se está depurando?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con este código es que no está manejando correctamente el código asíncrono. La promesa no se está resolviendo porque la declaración de retorno se ejecuta antes de que se cumpla la promesa.

    Para manejar correctamente las promesas, debe envolver toda la función en una promesa y resolverla con el objeto de usuario después de que se cumpla la promesa. Aquí hay un ejemplo de cómo hacerlo:

    function GetSession(userClient, userId) {
      return new Promise((resolve, reject) => {
        var user = { userId: '', name: ''};
    
        userClient.session.get(userId)
          .then(function(result) {
            user.userId = result.userId;
            user.name = result.name;
            resolve(user); // resolver promesa con objeto de usuario
          })
          .catch(err => reject(err)); // rechazar promesa con error
      });
    }
    

    De esta manera, puede llamar a la función y esperar a que se resuelva la promesa antes de acceder al objeto de usuario:

    GetSession(userClient, userId)
      .then(user => console.log(user))
      .catch(err => console.error(err));
    

Comments are closed.