2015-10-09 7 views
9

Ich versuche, Service Worker in meine App zu integrieren, aber ich habe festgestellt, der Service Worker versucht, zwischengespeicherten Inhalt abrufen, auch wenn online, aber ich möchte, dass das Netzwerk in diesen Situationen. Wie kann ich das machen? Unten ist der Code, den ich jetzt habe, aber ich glaube nicht, dass es funktioniert. Der SW-Installationscode wird der Kürze halber weggelassen.Verwenden Sie ServiceWorker-Cache nur, wenn offline

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; 
     } 
     }); 
    }) 
); 
}); 

Dies scheint Warnungen zu führen wie The FetchEvent for "[url]" resulted in a network error response: an object that was not a Response was passed to respondWith(). ich Service-Mitarbeiter neu bin, so entschuldigen uns für die irren Terminologie oder schlechte Praktiken, irgendwelche Tipps begrüßen würde. Vielen Dank!

+0

Tritt die Warnung nur offline auf? Es ist möglich, dass Sie Anfragen für unerwartete URLs wie Favicons erhalten, die nicht in Ihrem Cache-Installationsereignis gespeichert sind. –

+0

Das passierte, wenn online, wenn offline der Service-Arbeiter tatsächlich zu arbeiten scheint, wie erwartet. –

+0

EDIT: Ich bekomme diese Fehler auch wenn offline, aber Sie haben Recht, nur für Ressourcen, die ich nicht im Cache gespeichert habe. –

Antwort

4

Ohne dies zu testen, meine Vermutung ist, dass Sie respondWith() nicht korrekt auflösen, wenn es keine Cache-Übereinstimmung gibt. According to MDN, soll der Code, der an respondWith() übergeben wird, "aufgelöst werden, indem ein Antwort- oder Netzwerkfehler zu Fetch zurückgegeben wird". Warum versuchen Sie es nicht einfach:

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

Siehe auch Jakes Offline-Kochbuch: https://jakearchibald.com/2014/offline-cookbook/#network-falling-back-to-cache –

+0

Dieser Code ist im Wesentlichen das gleiche wie das, was ich oben habe, und leider ergibt sich die gleiche Fehler:/ –

+0

Angesichts der Tatsache, dass dies die dokumentierte Methode zu sein scheint, akzeptiere ich das und gehe davon aus, dass irgendwo etwas Fauliges vor sich geht ... Wird aktualisiert, wenn ich mehr entdecke. –