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

118
Visualizações
excepción de captura lanzada por el evento del mensaje del trabajador del servicio

No puedo detectar una excepción lanzada por el evento de mensaje del trabajador del servicio.

El cliente usa el siguiente código para ejecutar el comando en el SW:

 import { messageSW } from "workbox-window"; // .. code for Workbox initialization/registration omitted messageSW(registration?.active, { type: "SYNC" }) .then((results) => { console.log("done"); }) .catch((e) => { console.error(e); });

En el lado SW ( sw.js ) tengo el siguiente código:

 self.addEventListener("message", async (event) => { if (requestType === "SYNC") { event.ports[0].postMessage(await longRunningTask()); } });

Esta solución funciona bien siempre que el software no genere ninguna excepción. Lo que significa que el cliente imprime el mensaje " hecho " después de que se ejecuta el proceso de ejecución prolongada en el SW. Si se lanza la excepción, nunca se devuelve nada.

He logrado solucionar el problema haciendo lo siguiente:

 self.addEventListener("message", async (event) => { if (requestType === "SYNC") { try { event.ports[0].postMessage(await longRunningTask()); } catch (error) { event.ports[0].postMessage(error); } } });

En este caso, el resultado siempre se devuelve independientemente, se imprime " hecho ", pero:

  1. ¿Cómo produzco realmente una excepción del trabajador del servicio, para que el cliente pueda capturarla y manejarla ?
  2. En general, sería bueno saber si lo que estoy haciendo es un enfoque apropiado sobre cómo se invocará el código asíncrono en el SW desde el cliente...
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Aquí está mi propia solución que terminé usando:

en el lado del trabajador de servicio - método auxiliar:

 async function replyToSenderAsync(event, task) { let isCanReply = event.ports && event.ports.length >= 0; try { const result = await task(); if (isCanReply) { event.ports[0].postMessage({ error: null, message: result }); } } catch (error) { if (isCanReply) { event.ports[0].postMessage({ error: error, message: null }); } } }

Cuando se detecta una excepción, establecemos la propiedad de error. Usar como:

 self.addEventListener("message", async (event) => { const requestType = event?.data?.type; if (requestType === "QUEUE_CLEAR") { await replyToSenderAsync(event, async () => await clearQueueAsync()); } });

en el contenedor de solicitud del lado del cliente:

 function sendMessageToSWAsync(targetSW, messageType, message) { return new Promise(function (resolve, reject) { if ( !isServiceWorkerSupported.value || !isServiceWorkerRegistered.value || !targetSW ) { reject(new Error("Unable to send the message to a service worker")); } try { messageSW(targetSW, { type: messageType, message: message }) .then((messageResponse) => { if (!messageResponse) { reject(new Error("Service worker responsed with empty response")); } else { if (messageResponse.error) { reject(messageResponse.error); } else { resolve(messageResponse.message); } } }) .catch((messageError) => { reject(messageError); }); } catch (error) { reject(error); } }); }

La magia aquí es leer la propiedad de error y rechazar la promesa si ese es el caso. (lo que provoca que se lance una excepción. Usar como

 try { let response = await sendMessageToSWAsync(registration?.active, "QUEUE_GET_ALL"); } catch(error) { } sendMessageToSWAsync(registration?.active, "QUEUE_GET_ALL") .then((response) => {}) .catch((error) => {})
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