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.

Atrapado en una promesa mientras esperaba la respuesta en formato JSON.

Estoy implementando Promises por primera vez en JS y obtengo una excepción no capturada en la consola mientras ejecuto el código que se muestra a continuación.

function data_present() {
    return new Promise((resolve, reject) => {
        fetch(api)
        .then(response => response.json())
        .then(message => { 
            console.log(message)
            if(message && Object.keys(message).length != 0) {
                resolve()
            }
            else {
                reject()
            }
        })
    })
}

Estoy manejando el resultado del valor de retorno de la promesa en la función principal de la siguiente manera y sigo obteniendo el mensaje de excepción no capturada en la promesa:

function main() {
    data_present().then(() => {
        load_graph()
    }).catch(() => {
        data_present()
    })
}

La lógica detrás de data_present() es esperar hasta que obtengamos una respuesta JSON no vacía en el punto final de la API y seguir consultándola si la respuesta JSON está vacía.

La excepción que estoy obteniendo es la siguiente:

Uncaught (in promise) undefined
(anonymous) @ index.js:34
Promise.then (async)
(anonymous) @ index.js:29
data_present @ index.js:26
(anonymous) @ index.js:56
Promise.catch (async)
getParametersData @ index.js:55
onclick @ (index):92
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “Uncaught (in promise) undefined” indica que hubo un error que no fue capturado dentro de la promesa. Para depurar este problema, puedes agregar un método .catch() al final de la cadena de promesas en la función data_present() para capturar cualquier error que ocurra durante la llamada a la API o el análisis JSON. Por ejemplo:

    function data_present() {
      return new Promise((resolve, reject) => {
        fetch(api)
          .then(response => response.json())
          .then(message => { 
            console.log(message);
            if (message && Object.keys(message).length != 0) {
              resolve();
            } else {
              reject();
            }
          })
          .catch(error => {
            console.error('Error: ', error);
            reject(error);
          });
      });
    }
    

    Esto registrará cualquier error que ocurra y también asegurará que sean capturados y manejados dentro de la cadena de promesas.

    Adicionalmente, en la función main(), en lugar de llamar nuevamente a data_present() en el bloque catch(), es posible que desees considerar llamar a setTimeout() para seguir consultando la API después de que haya transcurrido un cierto período de tiempo. Esto evitará un bucle infinito y llamadas excesivas a la API.

Comments are closed.