Quello che vedi è il comportamento previsto e non è probabile che cambi.
Gli addetti all'assistenza hanno intenzionalmente una durata molto breve. Sono "nati" in risposta a un evento specifico (install
, activate
, message
, fetch
, push
, ecc.), Eseguono il loro compito e quindi "muoiono" poco dopo. La durata della vita è normalmente abbastanza lunga da poter gestire più eventi (ad esempio un install
potrebbe essere seguito da un activate
seguito da un fetch
) prima che il lavoratore muoia, ma alla fine morirà. Questo è il motivo per cui è molto importante non fare affidamento su nessuno stato globale nei propri script e per eseguire il bootstrap di qualsiasi informazione di stato necessaria tramite IndexedDB o Cache Storage API all'avvio dell'operatore di servizio.
Gli addetti all'assistenza sono effettivamente processi in background che vengono installati ogni volta che si visitano determinate pagine Web. Se i processi in background sono stati autorizzati a funzionare a tempo indeterminato, aumenta il rischio di impatto negativo sulla batteria e sulle prestazioni del dispositivo/computer. Per mitigare questo rischio, il tuo browser eseguirà solo quei processi quando sa che è necessario, cioè in risposta a un evento.
Un caso d'uso per WebSockets
è che il client stia ascoltando alcuni dati dal server. Per questo caso d'uso, l'alternativa di facile utilizzo del servizio all'uso di WebSockets
consiste nell'utilizzare lo Push Messaging API e fare in modo che l'addetto all'assistenza risponda agli eventi push
. Tieni presente che nell'attuale implementazione di Chrome, devi mostrare una notifica visibile all'utente quando si gestisce un evento push
. Il caso d'uso "silenzioso" push
non è supportato al momento.
Se invece di ascoltare i dati dal server, stavi usando WebSockets
come un modo per inviare dati dal tuo client al tuo server, purtroppo non c'è un ottimo modo per farlo. Ad un certo punto in futuro, potrebbe esserci un modo per registrare il tuo addetto al servizio di essere svegliato tramite un evento periodico/temporale, a quel punto potresti usare fetch()
per inviare dati al server, ma al momento non è supportato in alcuno i browser.
P.S .: Chrome (normalmente) non uccide un operatore di servizio mentre è aperta l'interfaccia DevTools, ma questo è solo per facilitare il debug e non è un comportamento su cui fare affidamento per un'applicazione reale.
fonte
2015-04-20 14:39:28
Per curiosità, perché non usi SharedWorkers per questo? –
@JaffaTheCake Solo perché ServiceWorker è abbastanza complesso per la mia piccola app offline. Ho usato l'approccio di SharedWorker + Appcache, ma sono passato a ServiceWorker a causa della * durata di vita più lunga *. Inoltre, SharedWorker ha [un bug] (http://stackoverflow.com/questions/28913545/shared-worker-is-teminated-on-reloading-page) sulla pagina di ricaricamento. – Lewis