Ich denke darüber nach, meine Anwendung mithilfe von Service-Mitarbeitern offline zu schalten. Ich erziele bereits zufriedenstellende Ergebnisse beim Zwischenspeichern von Ressourcen, aber ich muss auch prüfen, ob ich mit dem Internet verbunden bin, wenn nicht - die Anfrage speichern und auf Onsync schieben.
Ich verstehe, dass zukünftige onsync wird dabei helfen, aber ich brauche - auch temporäre - Lösung dafür.
Ich habe versucht, nur die Anforderungen in einem Array in Worker zu speichern, aber es ist nicht persistent - funktioniert nicht nach dem Neustart des Computers (während SW funktioniert und Offline-Inhalt dient).
Was ist die gute Richtung - Speichern Sie es im Cache wie Dateien irgendwie? Oder mit IndexedDB/SimpleDB (Accessing indexedDB in ServiceWorker. Race condition)?Speichern von REST-Anforderungen mit Service-Mitarbeitern, um sie zu synchronisieren
Antwort
Es ist ein Beispiel bei https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics einen Servicemitarbeiter der Verwendung von Fehlern für bestimmte Arten von Anfragen zu erfassen (in diesem Fall Google Analytics Pings über HTTP GET
) und die Fehler IndexedDB
mit Schlange. Die Warteschlange wird jedes Mal überprüft, wenn der Service Worker gestartet wird, und wenn die Anforderung erfolgreich "erneut wiedergegeben" werden kann (weil das Netzwerk jetzt verfügbar ist), wird sie aus der Warteschlange entfernt. Es gibt zwar keine Garantie dafür, wann ein Service-Mitarbeiter gestartet wird (Hintergrundsynchronisierungsereignisse helfen in Zukunft), aber Sie können davon ausgehen, dass der Service-Mitarbeiter sich selbst wiederbelebt, wenn er die Web-App aktiv verwendet.
Dies kann auf andere Arten von Anfragen verallgemeinert werden, wie HTTP POST
s, aber es gibt ein paar Dinge zu denken:
- Stellen Sie sicher, Ihre Benutzer sind sich bewusst, dass ihre HTTP
POST
in der Warteschlange und wird wiedergegeben werden. Da HTTPPOST
s normalerweise den serverseitigen Status ändert, möchten Sie die Benutzer nicht überraschen, wenn sich aufgrund einer X-Stunden alten Anforderung eine Änderung ergibt. - Je nachdem, welchen Dienst Sie anrufen, benötigt HTTP
POST
s möglicherweise einen gültigen HeaderAuthorization
. Wenn Sie OAuth 2 für die Autorisierung verwenden, verwendet es möglicherweise Zugriffstoken mit einer begrenzten Lebensdauer. Ein zuvor gültiges Autorisierungstoken ist möglicherweise zu dem Zeitpunkt abgelaufen, zu dem Sie die Anforderung erneut wiedergeben. IndexedDB
ist eine gute Wahl für die Warteschlange Ihrer Anfragen, da es Flexibilität bietet bei der Speicherung von beliebigen Daten, und es sollte möglich sein, z. B. den Körper der HTTPPOST
ohne viel Arbeit zu speichern. Wenn SieIndexedDB
nicht verwenden können (Sie sagen, es wird nicht unter Verwendung Cordova unterstützt), dann die einzige andere Option wäre, zu versuchen, die Cache Storage API zu verwenden, um einen neuen "Warteschlange" -Cache zu erstellen, mit fehlgeschlagenRequest
s als die Schlüssel und leereResponse
Objekte als die Werte. Beim Start des Service-Mitarbeiters können Sie diekeys()
-Methode in Ihrem "Queue" -Cache verwenden, um eine Liste allerRequests
zu erhalten, und für jede , rufen Siefetch(queuedRequest)
, um es erneut zu spielen. Ich habe diesen Ansatz nicht schon einmal ausprobiert, aber ich denke, es sollte funktionieren.
Perfekte Antwort, danke Jeff! –
Kann jemand ein Beispiel dafür geben, wie der HTTP-POST-Text in IndexedDB gespeichert und später abgerufen wird? – alearg
- 1. Synchronisieren eines Timers, um Überlappungen zu vermeiden
- 2. Verwendung von Jquery aufgeschoben, um Animation und Ajax zu synchronisieren
- 3. Wählen Sie Verzeichnis/Ordner, um zu speichern?
- 4. wie Dinge in Kerndaten zu speichern und mit Backendless zu synchronisieren
- 5. Synchronisieren von String zu & str
- 6. Speichern Sie Kontrollkästchen, um Tabelle mit CakePHP zu trennen
- 7. Ist Rake db: migrieren Sie den richtigen Befehl, um schema.rb erneut mit Ihrem Datenbankschema zu synchronisieren?
- 8. Synchronisieren mit Julia CUDArt?
- 9. Verwenden Sie den ISAPI-Filter, um einen WCF-Aufruf zu verfolgen und zu synchronisieren?
- 10. Synchronisieren von asynchronen Ereignissen
- 11. Synchronisieren von UIView-Layout zu OpenGL-Frames
- 12. Azure AD Connect, um mehrere Forests zu synchronisieren
- 13. So synchronisieren Sie MySQL InnoDB Tabellendaten mit Memory Tabelle
- 14. Synchronisieren Sie Niederlassungen in mercurial
- 15. Synchronisieren von Eclipse-Aktionsregeln
- 16. So synchronisieren Sie Threads beim Abfragen von Statusänderungen mit Boost
- 17. Synchronisieren von Threadpool
- 18. Synchronisieren von Audiodateien mit HTML5 und JavaScript
- 19. Synchronisieren Sie zwei Tabellen mit jquery
- 20. Der beste Weg, um zwei Threads miteinander zu synchronisieren
- 21. Ich brauche einen Git-Hook, um MySql-Schema zu synchronisieren
- 22. Eine Möglichkeit, Daten zu unterscheiden, wenn Sie db synchronisieren?
- 23. Synchronisieren von Threads mit Bedingungsvariablen (Monitoren)
- 24. Wo Werte zu speichern, um sie aus Vorlage in Winkel
- 25. Was ist der effizienteste Weg, um eine Benutzerdatenbank mit einem externen Mailinglistendienst zu synchronisieren?
- 26. Synchronisieren von Datenbanken sqlite mit mysql
- 27. PyCharm - wie Projektansicht mit Editor zu synchronisieren
- 28. Wie node_modules mit tatsächlichen package.json zu synchronisieren
- 29. Wie pip Bibliotheken mit PyCharm zu synchronisieren
- 30. Synchronisieren Sie zwei ListView-Positionen
Es ist nicht sehr klar, was Ihr Problem ist. Wenn Ihre Frage ist, ob IndexedDB für Offline-Speicher verwendet werden kann, dann ja. Wenn Sie nicht wissen, wie Sie Ihre Speichervorgänge ausführen sollen, damit sie sowohl den Online- als auch den Offline-Modus unterstützen, können Sie hier sehen, was sie hier vorgeschlagen haben: http://StackOverflow.com/questions/22342836/syncing-indexeddb-with-sql -server – dekkard
Danke, aber ich suche nach einer Möglichkeit, POST-Anfragen in Service Worker zu speichern, wenn ich offline bin, um sie zu synchronisieren, wenn ich online gehe. Das Speichern in IndexedDB könnte eine Lösung sein, aber IndexedDB wird nicht von [Cordova Plugin] (https://github.com/MobileChromeApps/cordova-plugin-service-worker/blob/master/README.md) unterstützt die einzige Möglichkeit, Service Worker jetzt auf iOS zu verwenden. –