Вы правы, контекст Service Worker не имеет доступа к localStorage. Поэтому, если в своем коде React вы сохраняете что-то в localStorage, Service Service Worker не может получить к нему доступ.
Существует два разных подхода к вопросу о том, «как обрабатывать HTTP POST, инициированные, когда пользователь был в автономном режиме»:
Без Service Worker, в коде вашего приложения (React). В вашем коде перед выполнением процедуры POST на сервере просто отметьте navigator.onLine
. Если это правда, то пользователь онлайн, и вы можете сделать POST. Если значение равно false, либо удерживайте запрос POST (или его содержимое, данные, тело) в переменной и т. Д. Или сохраните его в localStorage;добавьте прослушиватель событий для события online
и создайте POST при срабатывании прослушивателя событий. Этот подход не имеет ничего общего с сервисными работниками. Вся логика в вашем коде приложения.
С сервисными работниками. Напишите код своего приложения без каких-либо проверок на navigator.onLine
, об этом вообще не нужно заботиться. Делайте ваши посты всякий раз, когда они действительно происходят (когда пользователь отправляет форму и т. Д.). Теперь в Service Worker подключите прослушиватель сетевых событий и сохраните их в IndexedDB или Cache для последующего использования, если соединение отключено. Когда снова в сети, запускайте запросы от сервисного работника.
Подходы реализуют логику в разных местах. Во-первых, все это в логике приложения. Второй делает его прозрачным для приложения и вместо этого обрабатывает все в SW. Там действительно нет правильного способа сделать это, все зависит от потребностей вашего приложения. В обоих случаях вы, вероятно, должны показывать пользователю какое-то уведомление в пользовательском интерфейсе о том, что происходит.
Для подхода Service Worker есть Workbox Background Sync, которую вы можете использовать, подробнее об этом здесь: https://developers.google.com/web/tools/workbox/modules/workbox-background-sync
Стоит также отметить, что при первом подходе POST не отправляется на сервер, если пользователь закрывает браузер / покидает приложение. В подходе SW можно использовать SW и фоновую синхронизацию, чтобы повторить запрос после восстановления соединения, даже если пользователь закрыл браузер / приложение.