2016-04-24 4 views
1

Auf Chrome Mac. Ich versuche einen ServiceWorker zu registrieren und eine Variable darauf einzustellen. Wenn ich register() anrufe und der Service Worker zuvor nicht installiert wurde, scheint die Eigenschaft "active" sofort auf null gesetzt zu werden und dann sehr bald danach (asynchron?) Initialisiert zu werden.ServiceWorkerRegistration.active wird nicht zum ersten Mal eingestellt (Chrome)

Mit anderen Worten, ich komme in den if-Block, wenn der Service-Mitarbeiter zum ersten Mal installiert wurde. Die Konsole zeigt die aktive Eigenschaft so an, dass sie in beiden console.dir() -Befehlen gleich dem ServiceWorker ist, aber die sw-Variable ist null.

Das Aktualisieren der Seite behebt das Problem. Weiß jemand, was das verursachen könnte?

Antwort

0

Der Service-Mitarbeiter ist registriert, aber noch nicht aktiv und kontrolliert Ihre Seite noch nicht. Wenn Sie möchten, dass Ihr Service-Mitarbeiter aktiv wird, können Sie die Funktion skipWaiting im install Event-Handler aufrufen.

Wenn der Service-Mitarbeiter die Seite steuern soll, sobald sie aktiv wird, können Sie die Clients.claim-Funktion im Ereignishandler activate verwenden.

Sie können ein Beispiel in der ServiceWorker Cookbook Immediate Claim recipe sehen.

3

Für den ersten Besuch beschreiben Sie, die Registrierung ist noch nicht active, wenn das Versprechen löst, aber es ist "Installation", so die Registrierung installing Eigenschaft wird einen Service-Arbeiter zurückgeben.

Da sich kein Service Worker im Status waiting befindet, wird er dann in activating und dann in active umgewandelt. Sie haben also Recht, in dieser Registrierung Eigenschaft ist zunächst nicht active, aber auf aktualisieren, wird es sein. wie Sie beobachtet

installing ServiceWorker {scriptURL: "http://...", state: "installing", onstatechange: null, onerror: null} 
statechange initial state installing changed to installed 
statechange initial state installing changed to activating 
statechange initial state installing changed to activated 

Die Zustandsänderungen geschehen asynchron

:

wird der folgende Code veranschaulichen:

navigator.serviceWorker.register('/serviceworker.js').then(onRegistration); 

function onRegistration(registration) { 
    if (registration.waiting) { 
    console.log('waiting', registration.waiting); 
    registration.waiting.addEventListener('statechange', onStateChange('waiting')); 
    } 

    if (registration.installing) { 
    console.log('installing', registration.installing); 
    registration.installing.addEventListener('statechange', onStateChange('installing')); 
    } 

    if (registration.active) { 
    console.log('active', registration.active); 
    registration.active.addEventListener('statechange', onStateChange('active')); 
    } 
} 

function onStateChange(from) { 
    return function(e) { 
    console.log('statechange', from, 'to', e.target.state); 
    } 
} 

Beim ersten Besuch der console.log ausgegeben werden würde.

Verwandte Themen