Мисля да прехвърля приложението си офлайн с помощта на обслужващи работници. Вече постигам задоволителни резултати с кеширане на ресурси, но също така трябва да проверя onfetch дали съм свързан с интернет, ако не - да запазя заявката и да я натисна onsync.
Разбирам, че бъдещият onsync ще помогне с това, но имам нужда - дори временно - решение за това.
Опитах се просто да съхранявам заявките в масив в рамките на worker, но не е постоянен - не работи след рестартиране на компютъра (докато SW работи и обслужва офлайн съдържание).
Каква е добрата посока - да го съхраним по някакъв начин в кеша като файлове? Или използване на IndexedDB / SimpleDB (Достъп до indexedDB в ServiceWorker. Състезание)?
Съхраняване на REST заявки с обслужващи работници за синхронизирането им
Отговори (1)
Има пример на https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics за използване на service worker за откриване на неуспехи за определени типове заявки (в този случай Google Анализ пингва чрез HTTP GET
) и подреждане на неуспехите с помощта на IndexedDB
. Опашката се проверява всеки път, когато сервизният работник се стартира и ако заявката може да бъде успешно „повтаряна“ (тъй като мрежата вече е достъпна), тя се премахва от опашката. Въпреки че няма гаранции за това кога ще се стартира услугата (събитията за фоново синхронизиране ще помогнат за това в бъдеще), можете спокойно да предположите, че ако някой използва активно вашето уеб приложение, услугата ще се съживи.
Това може да се обобщи за други типове заявки, като HTTP POST
s, но има няколко неща, за които да помислите:
- Уверете се, че вашите потребители знаят, че техният HTTP
POST
е на опашка и ще бъде възпроизведен отново. Тъй като HTTPPOST
s обикновено променят състоянието от страна на сървъра, не искате да изненадате потребителите, когато нещо се промени в резултат на преиграна заявка, която е на X часа. - В зависимост от услугата, която извиквате, HTTP
POST
s може да изисква валидна заглавкаAuthorization
. Ако използвате OAuth 2 за оторизация, той може да използва токени за достъп, които имат ограничен живот. Валидният по-рано токен за оторизация може да е изтекъл до момента, в който повторите заявката. IndexedDB
е добър избор за поставяне на вашите заявки в опашка, тъй като предлага гъвкавост при съхраняване на произволни данни и би трябвало да е възможно, например, да съхранявате тялото на HTTPPOST
без много работа. Ако не можете да използватеIndexedDB
(казвате, че не се поддържа чрез Cordova), тогава единствената друга опция, за която мога да се сетя, е да опитам да използвам кеш паметта API за създаване на нов кеш на "опашка", с неуспешниRequest
s като ключове и празниResponse
обекти като стойности. При стартиране на service worker можете да използвате методаkeys()
във вашия кеш "queue", за да получите списък с всичкиRequests
и за всякоqueuedRequest
извикайтеfetch(queuedRequest)
, за да го възпроизведете отново. Не съм опитвал този подход преди, но мисля, че трябва да работи.