2017-01-10 5 views
1

Я использую следующую логику в моем работнике службы (в моих собственных словах):Service Worker получить из кэша затем обновить кэш

Если кэш существует, то использовать его, но и обновлять кэш из сети для позже

event.respondWith(// on `fetch` 
    caches.open(CACHE) 
     .then(function(cache) { 
      return cache.match(request); 
     }) 
     .then(function(matching) { 
      if (matching) { 
       requestAndUpdateCache(event); 
       return matching; 
      } 
      ... 

В дополнение к ответам с кэшированного ответа, я также запустить эту функцию, называемую requestAndUpdateCache.

function requestAndUpdateCache(event){ 
    var url = event.request.url + '?t=' + new Date().getTime(); 
    fetch(url) 
     .then(function(response){ 
      if (response && response.status === 200){ 
       caches.open(CACHE) 
        .then(function(cache){ 
         cache.put(event.request, response.clone()); 
        }); 
      } 
     }, function(error){ 
      console.log(error); 
     }); 
} 

Вопросы: Имеет ли эта функция и ее размещение имеет смысл выполнить логику, описанную выше?

ответ

5

То, что вы описываете, является устаревшей стратегией.

Каноническое место для поиска реализаций различных стратегий кэширования сервисных работников - это The Offline Cookbook Jake Archibald. Там в section, который охватывает несвежий-While-перепроверить, включая следующий код:

self.addEventListener('fetch', function(event) { 
    event.respondWith(
    caches.open('mysite-dynamic').then(function(cache) { 
     return cache.match(event.request).then(function(response) { 
     var fetchPromise = fetch(event.request).then(function(networkResponse) { 
      cache.put(event.request, networkResponse.clone()); 
      return networkResponse; 
     }) 
     return response || fetchPromise; 
     }) 
    }) 
); 
}); 
+1

было бы лучше использовать 'Promise.race' с ответами кэша и сети? –

+1

Вы можете быть уверены, что если вы с некоторой неуверенностью узнаете, используется ли кешированный или «свежий» ответ. –

+2

Что делать, если я хочу, чтобы сетевой ответ не просто обновлял кеш, но также был видимым по мере его поступления? например, отображать устаревшую информацию на секунду, а затем обновлять ее с помощью новой информации –