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.
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 aconsole.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:Alternativamente, puedes usar una
Promise
para manejar la respuesta de forma asíncrona. Esto se puede hacer de la siguiente manera:Aquí, la función
getCookie
devuelve unaPromise
que se resuelve con la respuesta cuando se recibe del script de fondo. El métodothen
se utiliza para manejar la respuesta de forma asíncrona, mientras que el métodocatch
se utiliza para manejar cualquier error que pueda ocurrir.