Сбой Service Worker при caches.open()

#progressive-web-apps #service-worker

#progressive-web-apps #service-worker

Вопрос:

Я пытаюсь запустить и запустить базовый service worker.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю «caches.open ()», браузер выдает

 sw.js:1 Uncaught (in promise) DOMException: Unexpected internal error
  

Закомментируйте кеши.open удаляет исключение.

Как я могу получить дополнительную информацию из браузера, чтобы узнать, что не так?

Вот service worker и регистрационный код.

 var CACHE_NAME = 'pwacache-v1';

var urlsToCache = [
    '/',
    'main.css'
];


self.addEventListener('install', function (event) {
    // Perform install steps
    console.log('install');
    try {
        event.waitUntil(getFiles());
    } catch (ex) {
        console.log(ex);
    }
});

function getFiles() {
    console.log('opening: '   CACHE_NAME );
    /*
        triggers Uncaught (in promise) DOMException: Unexpected internal error
    */
    caches.open(CACHE_NAME).then(function (cache) {
        return Promise.all(
            urlsToCache.map(function (url) {
                console.log(url);
                return cache.add(url).catch(function (reason) {
                    console.log([url   "failed: "   String(reason)]);
                });
            }) // end of map
        );
    });
    console.log('waiting 3...')
}
  

И регистрационный код

 // https://developers.google.com/web/fundamentals/primers/service-workers/registration
if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('sw.js');
  });
}
  

Я вижу sw.js зарегистрирован на вкладке «Приложение» Chrome.

Комментарии:

1. Ошибка возникает только при запуске Visual Studio браузера Google Chrome. Если я вручную запускаю Chrome, или использую Chrome Igconito Window, или использую Microsoft Edge, исключение DOM отсутствует. Тьфу.

Ответ №1:

Вам нужно вернуть обещание из getFiles() , чтобы на самом event.waitUntil() деле дождаться асинхронной работы. Поэтому я рекомендую вернуть обещание, возвращенное вашей цепочкой обещаний, с которой началась caches.open() .

Без этого возможно, что service worker завершается до завершения асинхронной работы.

Комментарии:

1. Спасибо, Бен, мне нужно будет выяснить, как это сделать, чтобы я мог попробовать. Есть идеи?

2. Добавьте return ключевое слово перед caches.open() вызовом.

3. Спасибо, Бен, ценю твою проницательность и помощь в программировании.