2017-01-23 4 views
0

Auf Schaltfläche klicken I für sync erfolgreich registrieren und feuert die Funktionalität, die ich in den service-worker beschrieben habe. Wenn ich offline bin - es wartet auf die Browser-Verbindung zu bekommen und dann feuert sie.Service-Arbeiter sync Brände nur das erste Mal

ABER - wenn ich die Taste zum ersten Mal klicken und alles ist in Ordnung - von dann erneut auf die Schaltfläche erfolgreich registriert für sync auf klicken, aber das sync Ereignis im Service-Arbeitern löst nie:

self.addEventListener('sync', function(event) { 
    console.log('EVENT in SYNC', event); 
} 

Ich sehe die Konsolenprotokollierung nur beim ersten Klicken auf die Schaltfläche. Fehle ich etwas?

+0

Haben Sie überprüft https://jakearchibald.github.io/isserviceworkerready/demos/sync/ und bestätigt, dass der Code die gleiche Sache tut? Wenn das nicht hilft, können Sie bitte sowohl die relevanten Teile Ihrer Client-Seite als auch Ihren Service-Worker-Code posten? –

+0

Oh ... Ich habe das repariert ... und vergessen, die Lösung aufzuschreiben ... Entschuldigung. Bitte nehmen Sie einen Blick auf die Antwort :) –

Antwort

1

Ich fand es heraus :) ... und das Problem war ziemlich lahm: der sync Handler in der Service-Arbeiter gab ein Versprechen, aber dieses Versprechen wurde nie gelöst. Sobald ich den resolve() Teil in der Handler zurückgegeben Versprechen hinzugefügt - alles hat gut funktioniert.

PS: In der Demo von Jake Archibald machte der Handler syncself.registration.showNotification, was ein Versprechen zurückgibt, und dieses Versprechen löst sich, sobald die Benachrichtigung angezeigt wird. Auf anderen Beispielen machen sie einfach fetch, die auch Versprechen zurückgibt, und dieses Versprechen löst Erfolg. Aber auf meinem Beispiel - ich zog Daten aus indexedDB und dann fetch machen. So - gerade gewickelt alles in

var p = new Promise(function(resolve, reject) { 
    // get data from indexedDB .. 
    fetch(...).then(function(response) { 
     return response; 
    }) 
    .then(function() { 
     // fetch was successful .. 
     resolve(); 
    }); 
}; 
return p; 

diese Weise ist es richtig funktionierte.

+0

Sie sollten Ihre Antwort als richtig markieren, wenn dies Ihre passende Lösung ist .. Es gab mir den richtigen Hinweis;) – goemic

+0

ich nicht für meine eigene Stimme kann Post :) –

+0

Das ist richtig, aber du kannst es als richtig markieren ;-) – goemic

Verwandte Themen