Я впервые работаю с сервисными работниками и уведомлениями.
Я пытаюсь показать уведомление в указанное время. Я пробовал делать это в сервис-воркере следующим образом:
function showNotification() {
setTimeout(function () {
self.registration.showNotification('Title', {
body: 'body blablabla',
badge: 'assets/images/logo.jpeg',
icon: 'assets/images/logo.jpeg',
renotify: false,
requireInteraction: true,
silent: false,
vibrate: [200, 100, 200],
dir: 'ltr',
lang: 'en-US'
});
}, 3000);
}
Я не получаю никаких уведомлений, если попробую это сделать. Когда я удаляю функцию setTimeout, я получаю уведомление, поэтому я предполагаю, что это как-то связано с тайм-аутом. Есть другой способ или я что-то упускаю?
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вызов функции в моей функции JavaScript в Chrome (вне Service Worker) действительно работает в моем случае, я пробовал это так:
function showNotification() {
navigator.serviceWorker.getRegistration().then(registration => {
setTimeout(() => {
registration.showNotification('Title', {
body: 'body blablabla',
badge: '/images/icon-light.png',
icon: '/images/icon-light.png',
renotify: false,
requireInteraction: true,
silent: false,
vibrate: [200, 100, 200],
dir: 'ltr',
lang: 'en-US'
});
}, 3000);
});
}
Вызов showNotification из ПО тоже работает, я просто попробовал следующий код вместе с Applications -> Service Workers -> Push в кнопке консоли Chrome Devtools, чтобы отправить push-уведомление, а затем отобразить его через 3 секунды:
self.addEventListener('push', function(event) {
if (event.data) {
console.info('This push event has data: ', event.data.text());
} else {
console.info('This push event has no data.');
}
setTimeout(() => {
self.registration.showNotification(
'Title',
{
body: 'body blablabla',
badge: '/images/icon-light.png',
icon: '/images/icon-light.png',
renotify: false,
requireInteraction: true,
silent: false,
vibrate: [200, 100, 200],
dir: 'ltr',
lang: 'en-US'
}
);
}, 3000);
});
Надеюсь это поможет!
это может привести к непредсказуемому сбою, поскольку браузер может решить убить сервис-воркера для экономии ресурсов. Вам нужно использовать
waitUntil, чтобы убедиться, что обслуживающий персонал остается в живых, пока не истечет тайм-аут. Даже тогда браузер может решить убить сервис-воркера в середине тайм-аута. Чем дольше период ожидания, тем больше шансов. И это хорошо. Представьте, что на каждой странице, которую вы когда-либо посещали, есть сервис-воркер, каждый из которых запускает тайм-ауты для отправки аналитических данных.