Обзор: Я пытаюсь избежать состояния гонки при доступе к IndexedDB как с веб-страницы, так и с веб-рабочего.
Настройка: Веб-страница, которая сохраняет элементы в локальную IndexedDB, когда пользователь работает с сайтом. Всякий раз, когда пользователь сохраняет данные в локальной БД, запись помечается как «Не отправлено».
Фоновый поток Web-worker, который извлекает данные из IndexedDB, отправляет их на сервер и, как только сервер их получает, помечает данные в IndexedDB как «Отправленные».
Проблема: Поскольку доступ к IndexedDB является асинхронным, я не могу гарантировать, что пользователь не обновит запись в то же время, когда веб-работник отправляет ее на сервер. Временная шкала показана ниже:
Не удалось Решение: Получив ответ от сервера, я могу еще раз проверить строку, чтобы увидеть, не было ли что-то изменено. Однако у меня все еще остается небольшое окно, в котором данные могут быть записаны в БД, и они никогда не будут отправлены на сервер.
Пример: После того, как сервер сообщит, что данные сохранены, затем:
IndexedDB.HasDataChanged(
function(changed) {
// Since this is async, this changed boolean could be lying.
// The data might have been updated after I checked and before I was called.
if (!changed){
IndexedDB.UpdateToSent() }
});
Другие примечания: В соответствии со спецификацией W3 существует api синхронизации, но его еще никто не реализовал, поэтому его нельзя использовать (http://www.w3.org/TR/IndexedDB/#sync-database). Sync api был разработан для использования веб-рабочими, чтобы избежать именно такой ситуации, как я полагаю.
Мы будем очень признательны за любые мысли по этому поводу. Работали над этим около недели и не смогли придумать ничего, что сработало бы.