【发布时间】:2017-01-14 19:03:19
【问题描述】:
我在 chrome 上使用 service worker 来缓存网络响应。当客户请求资源时我打算做什么:
检查缓存 - 如果存在,则从缓存返回,但如果文件与缓存版本不同,也会向服务器发送请求并更新缓存。 如果缓存没有,向服务器发送请求,然后缓存响应。
这是我当前执行相同操作的代码:
self.addEventListener('fetch', function (event) {
var requestURL = new URL(event.request.url);
var freshResource = fetch(event.request).then(function (response) {
if (response.ok && requestURL.origin === location.origin) {
// All good? Update the cache with the network response
caches.open(CACHE_NAME).then(function (cache) {
cache.put(event.request, response);
});
}
// Return the clone as the response would be consumed while caching it
return response.clone();
});
var cachedResource = caches.open(CACHE_NAME).then(function (cache) {
return cache.match(event.request);
});
event.respondWith(cachedResource.catch(function () {
return freshResource;
}));
});
此代码不起作用,因为它会引发错误:
url 的 FetchEvent 导致网络错误响应:一个不是 Response 的对象被传递给了 respondWith()。
谁能指出我正确的方向?
【问题讨论】:
-
catch实际上返回一个 Promise 对象。您可能希望将then处理程序附加到cachedResource并在其中调用respondWith -
@thefourtheye - 你的意思是,在
then中为cache.match调用event.respondWith?这将是一个错误,因为 fetch 将在执行caches.open时解决。我进行了更改并运行代码以找到此错误。 -
@Awol:怎么会这样?大概是缓存打开和匹配比获取更快?
-
@Bergi - Fetch 确实比打开缓存需要更多时间,但
event.respondWith在caches.open内部被触发,在fetch处理程序结束后触发 -
好的,伙计们。我解决了我的问题并发布了答案。非常感谢您的想法!
标签: javascript caching promise service-worker