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.

Chrome.runtime.onMessage devuelve “undefined” incluso cuando se conoce el valor de la respuesta asíncrona.

En mi código tengo un script de contenido que solicita una cookie al script de fondo.

A pesar de que puedo imprimir la cookie en la consola de la herramienta de desarrollo, el mensaje recibido del script de fondo siempre es “indefinido”.

¿Por qué?

Script de fondo:

// escucha las solicitudes de los scripts de contenido para obtener la cookie
chrome.runtime.onMessage.addListener((mensaje, remitente, enviarRespuesta) => {
// Responde con el valor de la cookie
if (mensaje === ‘get-cookie’) {
chrome.cookies.get({“url”: “http://www.example.com”, “name”: “cookie_example”}, function(cookie) {
// imprime el valor correcto
console.log(cookie.value);
enviarRespuesta(cookie.value);
});
}
});

Script de contenido:

chrome.runtime.sendMessage(‘get-cookie’, (respuesta) => {
// registra “indefinido”
console.log(respuesta);
/* intenta hacer algo útil con la respuesta */
});

Y devuelve un error:

Unchecked runtime.lastError: Se cerró el puerto del mensaje antes de recibir una respuesta.

Tags:  

Answer

  1. Avatar for davy.ai

    El problema probablemente se deba a la naturaleza asíncrona de JavaScript. La función sendMessage envía un mensaje al script de fondo y pasa inmediatamente a la siguiente línea de código sin esperar una respuesta. Por lo tanto, cuando se llama a console.log(response), es posible que aún no haya una respuesta.

    Para manejar esto, la función sendMessage debe incluir un parámetro de devolución de llamada que se invoque con la respuesta cuando se reciba del script de fondo. Esto se puede hacer de la siguiente manera:

    chrome.runtime.sendMessage('get-cookie', function(response) {
      console.log(response);
      // hacer algo con la respuesta
    });
    

    Alternativamente, puedes usar una Promise para manejar la respuesta de forma asíncrona. Esto se puede hacer de la siguiente manera:

    function getCookie() {
      return new Promise(function(resolve, reject) {
        chrome.runtime.sendMessage('get-cookie', function(response) {
          if (chrome.runtime.lastError) {
            reject(chrome.runtime.lastError);
          } else {
            resolve(response);
          }
        });
      });
    }
    
    getCookie().then(function(response) {
      console.log(response);
      // hacer algo con la respuesta
    }).catch(function(error) {
      console.error(error);
    });
    

    Aquí, la función getCookie devuelve una Promise que se resuelve con la respuesta cuando se recibe del script de fondo. El método then se utiliza para manejar la respuesta de forma asíncrona, mientras que el método catch se utiliza para manejar cualquier error que pueda ocurrir.

Comments are closed.