self.skipWaiting () не работает в Service Worker - PullRequest
0 голосов
/ 11 февраля 2019

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

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(), он сразу активируется.

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

1 Ответ

0 голосов
/ 11 июня 2019

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

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

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

Вы можете заставить SW игнорировать определенные маршруты (ниже), или вы можете попытаться принудительно выполнить принудительное выполнение.запросы на прекращение (возможно, с помощью 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

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

...