Я использую сервис-службу на chrome для кэширования сетевых ответов. То, что я намереваюсь делать, когда клиент запрашивает ресурс:Работник службы Javascript: извлечение ресурса из кеша, но также его обновление
Проверить кеш - если он существует, вернитесь из кеша, а также отправьте запрос на сервер и кеш обновления, если файл отличается от кешированной версии. Если кэш не имеет его, отправьте запрос на него на сервер и затем кешируйте ответ.
Вот мой текущий код делает то же самое:
self.addEventListener('fetch', function (event) {
var requestURL = new URL(event.request.url);
var freshResource = fetch(event.request).then(function (response) {
if (response.ok && requestURL.origin === location.origin) {
// All good? Update the cache with the network response
caches.open(CACHE_NAME).then(function (cache) {
cache.put(event.request, response);
});
}
// Return the clone as the response would be consumed while caching it
return response.clone();
});
var cachedResource = caches.open(CACHE_NAME).then(function (cache) {
return cache.match(event.request);
});
event.respondWith(cachedResource.catch(function() {
return freshResource;
}));
});
Этот код не работает, как он выдает ошибку:
The FetchEvent for url resulted in a network error response: an object that was not a Response was passed to respondWith().
Может кто-нибудь мне точку в правильном направлении?
'catch' фактически возвращает объект Promise , вы можете захотеть привязать обработчик 'then' к' cachedResource' и вызвать 'replyWith' в пределах этого – thefourtheye
@thefourtheye - Не имеете в виду, вызывайте' event.respondWith' внутри 'then' для' cache.match'? Это будет ошибка, так как выборка будет разрешена к моменту выполнения 'caches.open'. Я сделал изменение и запустил код, чтобы найти эту ошибку. – Awol
@Awol: Как так? Предположительно, кеш открывается и соответствует быстрее, чем выборка? – Bergi