2015-10-09 11 views
9

Sto cercando di integrare i lavoratori dei servizi nella mia app, ma ho trovato l'operaio di servizio tenta di recuperare il contenuto della cache anche quando online, ma voglio che preferiscono la rete in queste situazioni. Come posso fare questo? Di seguito è riportato il codice che ho ora, ma non credo che funzioni. Il codice di installazione SW è omesso per brevità.Usa ServiceWorker cache quando collegato

var CACHE_NAME = 'my-cache-v1'; 
var urlsToCache = [ 
    /* my cached file list */ 
]; 

self.addEventListener('install', function(event) { 
    // Perform install steps 
    event.waitUntil(
    caches.open(CACHE_NAME) 
     .then(function(cache) { 
     console.log('Opened cache'); 
     return cache.addAll(urlsToCache); 
     }) 
); 
}); 

/* request is being made */ 
self.addEventListener('fetch', function(event) { 
    event.respondWith(
    //first try to run the request normally 
    fetch(event.request).catch(function() { 
     //catch errors by attempting to match in cache 
     return caches.match(event.request).then(function(response) { 
     // Cache hit - return response 
     if (response) { 
      return response; 
     } 
     }); 
    }) 
); 
}); 

Questo sembra portare ad avvertimenti come The FetchEvent for "[url]" resulted in a network error response: an object that was not a Response was passed to respondWith(). Sono nuovo di lavoratori dei servizi, in modo da scuse per qualsiasi terminologia sbagliate o cattive pratiche, accoglierebbero eventuali suggerimenti. Grazie!

+0

Gli avvisi si verificano solo mentre si è offline? È possibile che si ottengano richieste di URL imprevisti, come le favicon, che non sono memorizzati nell'evento di installazione della cache. –

+0

Questo è accaduto quando online, quando offline il lavoratore del servizio sembra funzionare come previsto. –

+0

EDIT: Ottengo anche questi errori quando sono offline, ma hai ragione, solo per le risorse che non ho memorizzato nella cache. –

risposta

4

Senza prova questo fuori, la mia ipotesi è che non si sta risolvendo respondWith() correttamente nel caso in cui non v'è alcuna corrispondenza cache. According to MDN, il codice passato a respondWith() si suppone che "risolvere restituendo un errore di risposta o di rete per Fetch." Quindi, perché non provare a fare questo:

self.addEventListener('fetch', function(event) { 
    event.respondWith(
    fetch(event.request).catch(function() { 
     return caches.match(event.request); 
    }) 
); 
}); 
+3

Vedi anche il ricettario offline di Jake: https://jakearchibald.com/2014/offline-cookbook/#network-falling-back-to-cache –

+0

Questo codice è essenzialmente uguale a quello che ho sopra e sfortunatamente ha come risultato stessi errori:/ –

+0

dato che questo sembra essere il metodo documentato, ho intenzione di accettare questo e assumere c'è qualcosa di sospetto in corso da qualche parte ... aggiornerà se scopro di più. –

Problemi correlati