2016-12-29 1 views
10

У меня есть приложение JS на стороне клиента, которое использует IndexedDB для хранения своего состояния. Работает отлично. Тем не менее, это довольно медленно, потому что я часто читаю и записываю в IndexedDB, чтобы состояние не становилось непоследовательным, когда открываются несколько вкладок.Долгосрочный процесс внутри Service Worker (или что-то подобное)

Моя идея заключалась в том, что ... все элементы доступа к базе данных были включены в Service Worker, а затем я могу кэшировать значения там в памяти, не беспокоясь о том, что другая вкладка могла изменить базу данных.

Это похоже на работу, но некоторые части моего приложения занимают много времени. Я могу сообщить статус (например, «X% done») от Рабочего Рабочего в мой пользовательский интерфейс. Но как Firefox, так и Chrome, похоже, убивают рабочего, если он работает более 30 секунд, что слишком мало для меня.

Есть ли способ обойти это ограничение? Если нет, то идеи для достижения чего-то подобного? Я думаю, что Shared Worker может это сделать, за исключением поддержки браузеров, и я не ожидаю, что теперь это улучшится благодаря импульсному обслуживанию Service Workers.

+0

Вы пытаетесь обновить все вкладки при изменении значения? – guest271314

+0

Иногда да, иногда нет. – dumbmatter

+0

Вы пытались использовать событие 'localStorage',' storage'? – guest271314

ответ

2

Я в конечном итоге с помощью Общий рабочий. В браузерах, которые не поддерживают общих работников, таких как Edge и Safari, я возвращаюсь к веб-рабочему и некоторому взломанному коду, чтобы позволить вам открывать приложение только на одной вкладке.

Поскольку 90% моих пользователей находятся на Firefox или Chrome в любом случае, я полагаю, что это не огромная потеря.

Я также wrote a library к (среди прочего) нормализуют API-интерфейсы, используемые в общих рабочих и Web Workers, поэтому у меня есть точно такой же код, работающий в обоих сценариях, разница лишь в том, является ли работник инициализируется Worker или SharedWorker.

3

Документация Google на рабочих службы говорит о том, что с помощью сотрудников службы в качестве кэш-памяти невозможно:

Это заканчивается, когда он не используется, и перезапущена, когда он рядом нужен, так что вы не можете рассчитывать на глобальное состояние в обработчиках onfetch и onmessage сервисного работника. Если есть информация, которую необходимо сохранить и повторно использовать заново, у сервис-работников есть доступ к API IndexedDB.

Мое предложение состоит в том, чтобы продолжать использовать служебных работников для сохранения данных в базе данных и использовать localStorage для создания shared cache between pages. Затем вкладка, вносящая изменения, отвечает за обновление кеша в localStorage и сохранение в IndexedDB через рабочего.

+0

У меня уже есть данные в IndexedDB, и несколько вкладок могут получить к нему доступ ... это просто медленное чтение и запись на диск. localStorage, вероятно, будет еще медленнее, если угодно. После нескольких размышлений я думаю, что SharedWorker - это точно то, что я хочу, но MS/Apple просто не собираются его поддерживать. – dumbmatter

0

Как вы сказали, SharedWorkers, похоже, именно то, что вам нужно. Я не уверен, почему вы думаете, что импульс внедрения ServiceWorkers не позволяет браузерам поддерживать SharedWorkers. Кажется, это два разных вида животных.

Насколько я понимаю ServiceWorkers следует использовать в качестве прокси-сервера для ваших запросов, когда ваше приложение в автономном режиме и тяжелый материал должно быть сделано в WebWorkers и SharedWorkers

https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker

+0

http://caniuse.com/#feat=sharedworkers Safari использовался для его поддержки, но удалил его. Microsoft не планирует ее поддерживать. Это другой зверь, чем работники службы, но рабочие службы имеют тонну импульса и, по крайней мере, некоторые случаи использования перекрываются. – dumbmatter

Смежные вопросы