Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

179
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda