- From: Jake Archibald <notifications@github.com>
- Date: Sun, 13 Mar 2016 05:23:26 -0700
- To: slightlyoff/ServiceWorker <ServiceWorker@noreply.github.com>
- Message-ID: <slightlyoff/ServiceWorker/issues/844/195947652@github.com>
> 1) Check cache for a hit and retrieve it > 2) Fetch from network Request URL, if error go to cache-hit > 3) Start off a timer that if gets in first will respond with a cache-hit > > It is also makes sure to update the cache even after the request has been responded to with a cache-hit. So, to me, the cache should be as up to date as possible. I think this achieves what you're trying to do: ```js self.addEventListener('fetch', event => { const cacheResponsePromise = caches.match(event.request); const networkFetchPromise = fetch(event.request); // # Populating the cache from the network // WARNING: by adding all responses into the cache like this, you'll run out // of space pretty quickly, you should restrict the URLs you do this for, or clean // the cache at some points event.waitUntil( networkFetchPromise.then(response => { // clone the response, because we're going to use it twice const responseClone = response.clone(); return caches.open('my-cache-name').then(cache => { return cache.put(event.request, responseClone); }); }) ); // # Responding to the request event.respondWith( // race the network and a timeout Promise.race([ networkFetchPromise, new Promise((_, reject) => { setTimeout(() => reject(Error('Timeout')), 2000); }) // if this times out or rejects, try the cacheā¦ ]).catch(() => cacheResponsePromise).then(response => { // if the cache has no match, defer to the network (without a timeout) // Note: you didn't say you wanted this, but it seems to make sense, // a slow network response is better than no response. return response || networkFetchPromise; }) ); }); ``` > You were right about the CATCH forcing a resolve but for the life of me WHY? A promise is a async representation of try/catch, and this is how try/catch works. See http://jsbin.com/vuhawa/edit?js,console - the function returns undefined rather than throwing, because the error has been caught by a catch clause. The same thing happens with promises: ```js const a = Promise.reject(Error('Broken')); const b = a.catch(() => "Hello"); ``` `a` rejects with an error, but `b` resolves with `"Hello"`. > Money's on meningitis Ooof, here's hoping for a speedy recovery. --- Reply to this email directly or view it on GitHub: https://github.com/slightlyoff/ServiceWorker/issues/844#issuecomment-195947652
Received on Sunday, 13 March 2016 12:24:00 UTC