El evento de instalación del trabajador del servicio recibe una instancia de ExtendableEvent para su controlador, que puede usar para pausar el registro llamando al método waitUntil() y pasar una promesa. p.ej
// inside service worker self.addEventListener('install', function(event) { ... event.waitUntil(promise1); console.log("waiting for promise1"); });Mi pregunta es si hay alguna forma de cancelar la espera después de un tiempo o que el registro de SW permanezca indefinidamente en la fase de "intentar instalar" mientras esa promesa no se resuelva o rechace. Como no vi ninguna opción de tiempo de espera o cancelación con el método waitUntil.
Primero, un pequeño detalle: el método InstallEvent waitUntil() de InstallEvent no detiene el registro. El registro del trabajador del servicio es distinto de la ejecución de la fase de install del trabajador del servicio registrado. (Hay más antecedentes en esta respuesta ).
Si llama a waitUntil() dentro de un controlador de eventos de install , el trabajador del servicio no saldrá del estado de installing hasta que se resuelva la promesa o hasta que se alcance un tiempo de espera específico del navegador, momento en el que creo que la promesa será tratado como si lo rechazara. Este tiempo de espera no forma parte de la especificación del trabajador del servicio y puede variar de un navegador a otro, por lo que no confiaría en que se establezca en ningún valor específico.
Parece que le gustaría imponer su propio tiempo de espera determinista con un límite estricto sobre cuánto tiempo deben esperar los usuarios. Si ese es el caso, puede hacerlo creando una nueva Promise y dentro de eso, combinando su operación asíncrona original con una llamada a setTimeout() .
const TIMEOUT_MS = ...; self.addEventListener('install', (event) => { const originalPromise = ...; const promiseWithTimeout = new Promise((resolve, reject) => { const id = setTimeout( () => reject(new Error(`Timed out after ${TIMEOUT_MS}ms`)), TIMEOUT_MS, ); originalPromise.then((result) => { clearTimeout(id); resolve(result); }).catch((err) => reject(err)); }); event.waitUntil(promiseWithTimeout); });