2017-09-08 29 views
3

Ich bin zu wollen ein entkräften zuvor GET von meinem Servicemitarbeiter im Cache gespeichert, wenn ein POST, PUT oder DELETE auf die gleichen URL oder eine URL einer Ressource oder Sammlung ‚unter‘ es geschieht, zum Beispiel:Service-Arbeiter: Invalidate spezifische zwischengespeicherten Antworten

sagen wir, ich cachen /subscriptions und später ich ein POST-/subscriptions ein neues Abonnement hinzufügen, oder sage ich PUT-/subscriptions/243 ein bestehendes Abonnement zu aktualisieren. Das bedeutet, dass meine im Cache gespeicherte Subskriptionsgruppe nun veraltete Daten enthält und ich sie aus meinem Cache löschen möchte, damit die nächste Anfrage an den Server gesendet wird.

Ich habe zwei Optionen gedacht, wo ich entweder möglich sind sich nicht sicher bin:

Kann ich ein Regexp im caches.match() Anruf?

Auf diese Weise konnte ich einfach die übergeordnete Sammlung Stück der angeforderten URL mit Schlüsseln im Cache gefunden.

Kann ich die Schlüssel für jede zwischengespeicherte Datenantwort abrufen?

Wenn ja, könnte ich nur jede Antwort durchlaufen und sehen, ob der Schlüssel meine Kriterien zum Löschen erfüllt.

Irgendwelche Ideen? Danke!

Antwort

3

Sie können keine RegExp oder etwas anderes als String-Matching (optional ignoring query parameters) verwenden, wenn Sie eine Suche über caches.match() durchführen.

Ich würde den zweiten Ansatz empfehlen, in dem Sie einen benannten Cache öffnen, get its keys, und filtern Sie dann nach denen, die Ihnen wichtig sind. Es ist nicht so viel Code und sieht ziemlich gut mit await/async aus:

async function deleteCacheEntriesMatching(cacheName, regexp) { 
    const cache = await caches.open(cacheName); 
    const cachedRequests = await cache.keys(); 
    // request.url is a full URL, not just a path, so use an appropriate RegExp! 
    const requestsToDelete = cachedRequests.filter(request => request.url.match(regexp)); 
    return Promise.all(requestsToDelete.map(request => cache.delete(request))); 
} 

// Call it like: 
await deleteCacheEntriesMatching('my-cache', new RegExp('/subscriptions'));