He notado que mi trabajador de servicio no responde a self.skipWaiting() cuando todavía hay tareas por ejecutar.
En el evento de fetch de mi trabajador de servicio, veo varias encuestas de Firebase que usan solicitudes HTTP POST.
Si manejo estas solicitudes en el trabajador de servicio así:
self.addEventListener("fetch", (event) => { if (event.request.method === "POST") { return event.respondWith(new Response(null, {status: 444})) } ... }) Entonces self.skipWaiting() siempre funciona como se esperaba.
Sin embargo, si hago lo siguiente:
self.addEventListener("fetch", (event) => { if (event.request.method === "POST") { return event.respondWith(fetch(event.request)) } ... }) Entonces self.skipWaiting() parece no tener efecto. En las herramientas de desarrollo de Chrome, el nuevo trabajador de servicio todavía no está activo (y tampoco tiene efecto hacer clic en el enlace azul skipWaiting ). 
Como resultado, parece que tengo que elegir entre asegurarme de que self.skipWaiting() funcione y permitir las solicitudes de sondeo de Firebase, pero no ambas. ¿Hay alguna manera de hacer que self.skipWaiting() funcione mientras se siguen permitiendo las solicitudes de sondeo de Firebase?
No veo en su código dónde está llamando a self.skipWaiting() , pero lo principal que debe saber sobre esa función es que "voltea" una bandera e intenta activar el trabajador del servicio de waiting . No estoy seguro de qué parte de esa secuencia no funciona como se esperaba, y tampoco estoy seguro de si estás describiendo algo que sucede solo en Chrome o también en otros navegadores. Si observa un comportamiento inesperado solo en Chrome, la mejor opción es presentar un error .
Dicho esto, con el fin de proporcionar una solución alternativa, quería decir que no es necesario llamar a event.respondWith() dentro de un controlador de eventos de fetch . Si todos sus controladores de fetch se completan sin que ninguno de ellos llame a fetchEvent.respondWith() , entonces se usará el comportamiento de red predeterminado del navegador en su lugar. Por lo tanto, podría reestructurar su controlador de fetch de la siguiente manera y quizás solucionar el problema.
self.addEventListener("fetch", (event) => { if (event.request.method === 'POST') { return; } // Your non-POST response logic goes here. });