Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

182
Vistas
Error de nueva promesa de ManifestV3: el puerto de mensajes se cerró antes de que se recibiera una respuesta

Estoy trabajando en una extensión que pasa muchos mensajes entre sus scripts de contenido y el trabajador del servicio en segundo plano (manifest V3), y noté un problema extraño con las nuevas API V3 basadas en Promise, específicamente con sendResponse () función.

Con las llamadas a la API que esperan una respuesta, todo funciona bien. Pero si no necesito una respuesta y no proporciono una función de devolución de llamada o uso el método .then() de la promesa (o async/await), se genera un error de Promesa: dice "El puerto de mensajes se cerró antes de que se respondiera". recibió."

Extrañamente, la llamada aún funciona, así que supongo que este error es más como una advertencia.

Ejemplo de código:

En un script de contenido, enviando un mensaje al fondo:

 chrome.runtime.sendMessage({ type: 'toggle_setting' })

El script de fondo recibe el mensaje y hace algo, luego sale sin enviar una respuesta:

 chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { if (message.type === 'toggle-setting') { //* do whatever it does } })

Ese código de fondo es lo que arroja el error descrito anteriormente. Pero si le agrego una línea y llamo a la función sendResponse() sin parámetros, no ocurre ningún error.

 chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { sendResponse() if (message.type === 'toggle-setting') { //* do whatever it does } })

Así que esto elimina los mensajes de error, pero no tengo muy claro por qué es necesario cuando no se necesita ni se espera una respuesta. ¿Hay alguna otra forma de señalar eso a las API V3 basadas en Promise, o ahora es necesario llamar a sendResponse() incluso si no es necesario?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Es un error en Chrome 99-101 , corregido en Chrome 102.

La razón es que sendMessage ahora se promete internamente, por lo que podemos await , pero el subproducto es que cuando no especificamos una devolución de llamada nosotros mismos, se agrega internamente de todos modos para que la llamada devuelva una Promesa, lo que significa que desde no llamamos a sendResponse en onMessage, la API pensará que fuimos nosotros quienes cometimos un error al usar una devolución de llamada y no proporcionar una respuesta , y lo informará como tal.

Solución alternativa 1: llamar a sendResponse() dentro de chrome.runtime.onMessage

  • remitente (en la pregunta es el script de contenido):

     chrome.runtime.sendMessage('test');
  • receptor (en la pregunta es el guión de fondo):

     chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { doSomethingWithoutResponding(msg); sendResponse(); });

Solución alternativa 2: suprima este error específico

También parcheando la falta inherente de la API de una pila de llamadas antes de la llamada.

 // sender (in the question it's the content script) sendMessage('foo'); // sendMessage('foo').then(res => whatever(res)); // await sendMessage('foo'); function sendMessage(msg) { const err1 = new Error('Callstack before sendMessage:'); return new Promise((resolve, reject) => { chrome.runtime.sendMessage(msg, res => { let err2 = chrome.runtime.lastError; if (!err2 || err2.message.startsWith('The message port closed before')) { resolve(res); } else { err2 = new Error(err2.message); err2.stack += err1.stack.replace(/^Error:\s*/, ''); reject(err2); } }); }); }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Agregue un return true al final de su escucha de mensajes para permitir la respuesta asíncrona

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda