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