2016-12-29 2 views
1

Что может вызвать Обещание, отклоненное 'InvalidStateError' здесь?Что может вызвать обещание, отклоненное здесь 'InvalidStateError' здесь?

const SERVICE_WORKER_VERSION = "3.0.0"; // is updated in the build when things change 
const CACHE_VERSION = SERVICE_WORKER_VERSION; 

const fillServiceWorkerCache = function() { 
    /* save in cache some static ressources 
    this happens before activation */ 
    return caches.open(CACHE_VERSION).then(function(cache) { 
     return cache.addAll(ressourcesToSaveInCache); 
    }); 
}; 

self.addEventListener("install", function (event) { 
    /*event.waitUntil takes a promise that should resolves successfully*/ 
    event.waitUntil(fillServiceWorkerCache().then(function() { 
     return self.skipWaiting(); 
    })); 
}); 

В Firefox версии 52 следующая ошибка: Service worker event waitUntil() was passed a promise that rejected with 'InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable'. Работник службы убит, и удаляется после этого. Он отлично работает с Chrome. ressourcesToSaveInCache - это массив относительных URL-адресов.

Редактировать изменить его на

event.waitUntil(
    fillServiceWorkerCache() 
    .then(skipWaiting) 
    .catch(skipWaiting) 
); 

и регистры обслуживания рабочих! Однако fillServiceWorkerCache отклонено, что немаловажно (без автономного кеша). Теперь вопрос в том, почему fillServiceWorkerCache отклоняет, и что сообщение об ошибке пытается сказать?

Редактировать вдохновленный ответ Хосар в:

const fillServiceWorkerCache2 = function() { 
    return caches.open(CACHE_VERSION).then(function (cache) { 
     return Promise.all(
      ressourcesToSaveInCache.map(function (url) { 
       return cache.add(url).catch(function (reason) { 
        return console.log(url + "failed: " + String(reason)); 
       }) 
      }) 
     ); 
    }); 
}; 

Эта версия распространяется обещание в обратной цепи, что делает waitUntil() на самом деле ждать. Он не будет кэшировать, а также не отклонять отдельные ресурсы, которые не были добавлены в кеш.

Edit 2: После исправления недействительных относительных URL-адресов в ressourcesToSaveInCache, ошибка исчезла

ответ

4

Скорее всего, является то, что IMG SRC не действует, как уже упоминалось here.
Итак, с cache.addAll, если один из запросов недействителен, ни один из запросов не будет сохранен. Лучше использовать: cache.add следующим образом:

return caches.open('cacheName').then(function(cache) { 
     Promise.all(
     ressourcesToSaveInCache.map(function(url){cache.add(url)}) 
    ); 
    }); 

В этом случае все действительные адреса будут сохранены.

Смежные вопросы