У меня есть Service Service Worker, который регистрируется при запуске моего приложения, и внутри него вызывается функция init () для запуска фоновых процессов, в частности, setInterval
, который вызывается каждую минуту. В целях тестирования я отправляю уведомление о том, что оно запускается через каждый интервал.
Проблема заключается в том, что всякий раз, когда я перезагружаю страницу или открываю другую вкладку с тем же приложением, она постоянно складывает новое setInterval
экземпляра, и я получаю уведомление от каждого из них.
Например, я открываю приложение с очищенным кэшем и получаю одно уведомление в минуту. Отлично. Я обновляю sh на той же странице, а затем получаю два уведомления в минуту (по мере нажатия на ссылку refre sh). Если я открою новую вкладку с тем же приложением, я получу третий экземпляр setInterval
, начинающийся в этот момент, и если я переименую sh эту вкладку тоже, я получу другой экземпляр, et c, et c.
Мне стыдно, что я не могу найти ответ, но я потратил слишком много времени на чтение и тестирование, но никуда не попал. Как мне остановить это поведение и что на самом деле здесь происходит?
Есть ли событие Service Worker, которое я могу использовать для вызова clearInterval
при обновлении вкладки или открытии новой вкладки?
ОБНОВЛЕНИЕ 2020-02-04
Вот упрощенная версия того, что я делаю. Кроме того, я использовал глобальное пространство для установки и очистки интервала, который обеспечивает перезагрузку отдельных вкладок. На полпути!
function init() {
// Clear the interval if it already exists on the global object
if (self.globalObj.initInterval) self.clearInterval(self.globalObj.initInterval);
// Set the interval to the global object
self.globalObj.initInterval = self.setInterval(() => {
// Notify the user every minute
if (self.Notification.permission === 'granted') {
self.registration.showNotification('You\'ve got new messages!', {
body: 'Click this link to open a new browser window to view your messages.',
});
}
}, 60000);
}
self.addEventListener('message', e => {
if (e.data === 'init') init();
});
Так что остается еще одна проблема, и это еще одна вкладка браузера. Несмотря на то, что код, который я только что опубликовал, разрешил несколько интервалов, выполняющихся при перезагрузке, новая вкладка по-прежнему обрабатывается как новый поток. Но это еще более странно, потому что время уведомления следующей вкладки всегда будет складываться сразу после срабатывания уведомления первой вкладки, независимо от того, когда вы его запустите. Так близко.
Мне может понадобиться откат к Shared Worker, как было предложено, но мы пытаемся использовать Service Workers, поскольку у нас есть поток, который мы используем для всего остального, и я хотел бы найти решение в мире Service Worker.
Спасибо за помощь!