2016-07-05 1 views
0

С помощью сервисного работника я хочу вернуть ответ из кеша, если соединение с сервером отсутствует. Тогда, если в кеше нет правильного ответа, я хочу вернуть пользовательский ответ.Возврат ответа из кеша, когда нет соединения с сервером

На данный момент, у меня есть этот код:

this.addEventListener('fetch', function (event) { 
    event.respondWith(
     timeout(5000, fetch(event.request)).catch(function() { 
      return caches.match(event.request); 
     }) 
    ); 
}); 

Я хочу иметь что-то вроде этого:

this.addEventListener('fetch', function (event) { 
    event.respondWith(
     timeout(5000, fetch(event.request)).catch(function() { 
      caches.match(event.request).then(function(cacheResponse) { 
       return cacheResponse; 
      }).catch(function() { 
       return new Response('No cache found'); 
      }) 
     }) 
    ); 
}); 

или даже лучше было бы

this.addEventListener('fetch', function (event) { 
    event.respondWith(
     timeout(5000, fetch(event.request)).catch(function() { 
      caches.match(event.request).then(function(cacheResponse) { 
       return cacheResponse; 
      }).catch(function() { 
       return caches.match(offlineMessageUrl); 
      }) 
     }) 
    ); 
}); 

, но это не за работой.

+0

plunker/jsfiddle/codepen? сложить вместе? – SoluableNonagon

+0

Как можно возиться с сервисным работником? – dandavis

+0

Я думаю, вы можете, поставив своего обслуживающего работника в отдельный jsfiddle. Например. https://jsfiddle.net/zalun/d10vsucu/ и https://jsfiddle.net/zalun/d80qawf9/. – Marco

ответ

0

Из документации функции Cache.match обещание всегда разрешается. Он разрешен с объектом Response или с неопределенным, если совпадение не найдено. Вы можете попробовать следующее: -

this.addEventListener('fetch', function (event) { 
     event.respondWith(
      caches.match(event.request).then(function(cacheResponse) { 
       return cacheResponse || new Response('No cache found'); 
      }).catch(function() { 
       return new Response('No cache found'); 
      }) 
     ); 
    });