0

我正在尝试cache-then-network在服务工作者中实施一种策略,该策略在后台更新缓存。我想避免不必要fetch的请求,所以想出了以下解决方案 -

function cache_then_network(event) {
    var updated = false;
    event.respondWith(
        caches.open(staticCacheName)
            .then(cache => cache.match(event.request)
                .then((response) => {
                    if (response) {
                        return response;
                    }
                    else {
                        return fetch(event.request)
                        .then((response) => {
                            const resClone = response.clone();
                            return caches.open(staticCacheName)
                                .then((cache) => {
                                    cache.put(event.request, response);
                                    updated = true;
                                    return resClone;
                                })
                        })
                    }
                })
            )
    )
    if (!updated) {
        event.waitUntil(update(event.request))
    }
}

update函数通过使用网络获取请求来更新缓存。问题是该updated变量始终为假,导致该update函数每次都运行。

我对服务人员不太熟悉,代码基本上是从多个来源拼接而成的。所以欢迎替代/更好的解决方案。我的最终目标是首先缓存,在后台从网络获取,并设置一个标志来告知内容是否已更改。

4

1 回答 1

0

Service Worker离线食谱有所有答案 -

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.open('mysite-dynamic').then(function(cache) {
      return cache.match(event.request).then(function(response) {
        var fetchPromise = fetch(event.request).then(function(networkResponse) {
          cache.put(event.request, networkResponse.clone());
          return networkResponse;
        })
        return response || fetchPromise;
      })
    })
  );
});
于 2019-11-01T06:36:32.567 回答