self.skipWaiting () не работает в Service Worker

У меня есть обслуживающий работник. Вот событие установки:

self.addEventListener('install', function (event) {
    console.log('Installing Service Worker ...', event);

    return self.skipWaiting()
    .then(() => caches.open(CACHE_STATIC_NAME))
    .then(function (cache) {
        return cache.addAll([
            './file1.html',
            './file2.html'
        ])
    })
});

По какой-то причине, когда я редактирую код сервис-воркера и обновляю параметр запроса в URL-адресе файла сервис-воркера, он устанавливается, но не активируется (согласно Chrome DevTools), хотя я вызвал self.skipWaiting().

Как ни странно, если я захожу в консоль, перехожу в область действия сервис-воркера и сам набираю self.skipWaiting(), он сразу же активируется.

Я уже много часов пытаюсь понять, что происходит, и совершенно сбит с толку. Что-то мне здесь не хватает?


person Ethan    schedule 11.02.2019    source источник
comment
Здесь та же проблема. ПО отказывается пропускатьWaiting () ..   -  person REJH    schedule 01.03.2019
comment
К сожалению, до сих пор не решил :(   -  person Ethan    schedule 02.03.2019
comment
Я вижу вашу проблему и задаю вам i.imgur.com/JtzlcIM.gifv   -  person Cillié Malan    schedule 25.06.2019
comment
После обновления до create-response-app v3 и workbox у меня возникла та же проблема, вызов self.skipWaiting() не работает, но нажатие кнопки skipWaiting в инструментах разработчика делает трюк, то же самое, если я нажимаю кнопку перезагрузки страницы несколько раз подряд   -  person fen1ksss    schedule 05.12.2019


Ответы (2)


Старый SW может не останавливаться, пока он все еще выполняет задачи - например, если у него был длительный запрос на выборку (например, сервер отправил события / источник событий или потоки выборки; хотя я не думаю, что веб-сокеты могут вызвать это, поскольку SW будет их игнорировать Думаю).

Однако я считаю, что в разных браузерах поведение различается. Кажется, что Chrome ждет, пока выполняется существующая задача (поэтому skipWaiting не удастся ...), но Safari, похоже, убивает задачу и активирует новый SW.

Хороший способ проверить, является ли это причиной вашей проблемы, - это убить ваш сервер сразу после того, как вы запросите skipWaiting (чтобы убить сетевые соединения). (Просто щелчок «Offline» в Dev Tools, похоже, не убивает все работающие соединения, например, EventSources продолжают работать.)

Вы можете заставить ПО игнорировать определенные маршруты (см. Ниже), или вы можете попытаться принудительно завершить запросы (возможно, используя AbortController).

self.addEventListener('fetch', function(event) {
  const { method, url } = event.request;
  if(event.request.method !== "GET") return false;
  if(url === "https://example.com/poll") return false;

  event.respondWith(
    caches.match(match).then(function(response) {
      return response || fetch(event.request);
    })
  );
});

Процесс skipWaiting находится в этой спецификации:

https://w3c.github.io/ServiceWorker/#try-activate-algorithm

Но мне не очень ясно, должен ли браузер ждать задач или завершать их (или переносить их в новое ПО?) Перед активацией нового ПО; и, как уже упоминалось, в настоящий момент он работает по-разному в разных браузерах ...

person ej.daly    schedule 11.06.2019

У меня была такая же проблема.

Я подтвердил свою проблему с помощью уловки, предоставленной @ ej.daly, в которой я должен остановить сервер, и сервис-воркер WAITING станет активным через несколько минут.

После этого я применил хак в своем коде: перезагрузите окно, если WAITING service worker не будет активирован в течение следующих 3 секунд.

Кстати, я разрабатываю библиотеку, чтобы упростить установку обслуживающего персонала для различных (часто используемых) сценариев в нашей компании. Взгляните на https://github.com/DreamworldSolutions/workbox-installer

person chirag    schedule 25.04.2021