服务工作者:使特定的缓存响应无效

时间:2017-09-08 14:20:48

标签: javascript caching web service-worker

我希望在GETPOSTPUT到同一个网址或任何网址时,从我的服务工作人员中取消先前缓存的DELETE一个资源或集合'在'它发生了,例如:

让我们说我缓存/subscriptions,之后我会POST添加/subscriptions添加新订阅,或者说我PUT/subscriptions/243 1}}更新现有订阅。 这意味着我的缓存订阅集合现在是陈旧数据,我想从缓存中删除它,以便下一个请求将转到服务器。

我想到了两个选项,我不确定是否可能:

我可以在caches.match()来电中使用正则表达式吗?

这样我就可以将请求的url的父集合段与缓存中找到的键匹配。

我可以获取每个缓存数据响应的密钥吗?

如果是这样,我可以遍历每个响应,看看密钥是否符合我删除它的标准。

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

通过caches.match()进行查询时,不能使用RegExp或字符串匹配以外的任何内容(可选ignoring query parameters)。

我建议使用第二种方法,在其中打开命名缓存get its keys,然后筛选您关注的缓存。代码不是那么多,await / async看起来相当不错:

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