【发布时间】:2020-02-25 17:01:22
【问题描述】:
我希望我的 Angularjs (1.x) 应用程序有一个离线版本作为备用,以防没有网络或没有互联网服务。
我想要 service worker 的 fetch 事件监听器,尝试从网络中获取主页(当 request.mode == 'navigate' 时),如果失败则返回缓存版本。
出于某种原因,即使我已断开 wifi 连接或在“飞行模式”下运行,fetch 总是返回 StatusCode 200 OK。但它确实有效,如果我打开 Chrome 的 DevTools “网络 > 离线”模式
...我试过的:
我尝试使用“navigator.onLine”功能检测离线模式,但不可靠。
也尝试清除缓存,但什么都没有。。仍然返回原始的“在线”html文档。
还尝试将“cache-control: no-store, no-cache”标头传递给 fetch,结果相同..
self.addEventListener('fetch', function (event) {
if (event.request.mode === 'navigate') {
event.respondWith(homeNetworkThenCache(event.request));
}
});
function homeNetworkThenCache(request){
return fetch(request)
.then(e => e)
.catch(() => caches.match(offlineHomepageUrl));
}
预期行为:
如果没有互联网连接,我希望获取进入“catch”块,但它总是进入“.then(e => e)”...
..有什么想法吗?
【问题讨论】:
-
您是否在 HTML 响应中设置了
Cache-Conrtol标头?听起来您最终可能会从浏览器的“正常”HTTP 缓存中读取这些响应。 -
当您输入 url 时,请求是由浏览器发出的。我在响应中看不到任何“Cache-control”标头。请求发送“Cache-Control: max-age=0”
-
您没有将
event.request作为参数传递给homeNetworkThenCache(),但是?这是你的实际代码还是你只是解释它? -
谢谢 Jeff.. 我添加了 event.request 参数,这是一个简化版本,而不是确切的真实代码
标签: caching fetch service-worker progressive-web-apps offlineapps