Тайм-аут уведомления работника службы Javascript

Я впервые работаю с сервисными работниками и уведомлениями.

Я пытаюсь показать уведомление в указанное время. Я пробовал делать это в сервис-воркере следующим образом:

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, я получаю уведомление, поэтому я предполагаю, что это как-то связано с тайм-аутом. Есть другой способ или я что-то упускаю?

Спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
2 096
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызов функции в моей функции 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, чтобы убедиться, что обслуживающий персонал остается в живых, пока не истечет тайм-аут. Даже тогда браузер может решить убить сервис-воркера в середине тайм-аута. Чем дольше период ожидания, тем больше шансов. И это хорошо. Представьте, что на каждой странице, которую вы когда-либо посещали, есть сервис-воркер, каждый из которых запускает тайм-ауты для отправки аналитических данных.

lordvlad 09.11.2018 11:48

Другие вопросы по теме