2016-06-18 54 views
13

MDN suggerisce che fate quanto segue per creare e popolare la cache operaio di servizio:Cosa fa event.waitUntil nel servizio di assistenza e perché è necessario?

this.addEventListener('install', function(event) { 
    event.waitUntil(
    caches.open('v1').then(function(cache) { 
     return cache.addAll([ 
     '/sw-test/', 
     '/sw-test/index.html', 
     ... etc ... 
     ]); 
    }) 
); 
}); 

Non capisco quel codice. Il metodo è documentato waitUntil troppo, e sembra che il codice di cui sopra è l'unico scopo della sua esistenza in questo momento:

Il metodo ExtendableEvent.waitUntil() estende la durata della manifestazione . Quando viene chiamato in un EventHandler associato all'evento di installazione, ritarda il trattamento dell'installatore come installato finché la promessa passata non viene risolta. Viene utilizzato principalmente per garantire che un lavoratore del servizio non sia considerato installato fino a quando tutte le core di memoria cache da cui dipende sono popolate.

Quello che non capisco è:

  • Come si fa waitUntil effetto generalmente flusso di codice? Interrompe la propagazione dell'evento finché non si risolve la promessa?
  • Perché è necessario nel contesto dell'apertura della cache dei lavoratori?

Sto chiedendo questa domanda perché ho problemi con il codice sopra e mi piacerebbe capirlo.

risposta

16

Come dice la descrizione, the ExtendableEvent.waitUntil() method extends the lifetime of the event. Se non lo si chiama all'interno di un metodo, è possibile interrompere il servizio in qualsiasi momento (vedere the specification).

Quindi, il metodo waitUntil viene utilizzato per indicare al browser di non interrompere il servizio fino a quando la promessa passata a waitUntil sia stata risolta o rifiutata.

Chi vostre domande specifiche:

  • Nel caso del install ei activate eventi, ritarda l'interruttore allo stato del lavoratore servizio per installed e activated (vedere il specification of the waitUntil method, in particolare l'ultima parte del il paragrafo).
  • Penso che il resto della mia risposta abbia già risposto sul perché è necessario.
+0

Ancora non capisco. Se rimuovo 'event.waitUntil', cosa succederà? Ho provato a rimuovere 'event.waitUntil', ha funzionato ancora bene. L'archiviazione nella cache aveva una risorsa memorizzata nella cache e la pagina poteva essere visitata offline. Se hai bisogno di Demo, posso inviarlo a te. – youngwind

+0

Se non lo chiami, l'addetto all'assistenza potrebbe essere fermato in qualsiasi momento. Questo non significa che verrà fermato, quindi in alcuni casi potrebbe funzionare e in alcuni casi (a seconda dei tempi) non funzionerà. – Marco

+0

Sì, avevo trovato quello che hai detto nel documento ufficiale. Quello che voglio sapere è: 1. Come attivare i casi "non funzionanti"? 2. Perché il lavoratore di servizio potrebbe essere fermato se non lo chiamo? Il punto chiave è Perché, non cosa. Non ho trovato la risposta nel documento. – youngwind