javascript - 服务工作者获取事件:为什么没有无限循环?
问题描述
这是关于在服务工作者fetch
内部处理事件时的一些行为。
当调用内部fetch
事件处理程序时,事件似乎不会再次被触发。这实际上很好,但我仍然想知道为什么这不会发生。fetch()
fetch
我查看了https://developers.google.com/web/ilt/pwa/caching-files-with-service-worker#on_network_response上的代码,如下所示:
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.open('mysite-dynamic').then(function(cache) {
return cache.match(event.request).then(function (response) {
return response || fetch(event.request).then(function(response) {
cache.put(event.request, response.clone());
return response;
});
});
})
);
});
我自己尝试过该代码,并且调用fetch()
(在 之后||
)被执行,但不会再次触发事件处理程序。为什么不?还有一些指向解释这一点的页面的链接将不胜感激。
解决方案
如评论中所述,fetch()
从服务工作者内部执行 a (即当全局对象为 时ServiceWorkerGlobalScope
)永远不会触发fetch
处理程序。
确定此行为的机制来自Fetch 规范,第 5.6 节,描述fetch()
,第 5 步:
如果请求的客户端的全局对象是一个 ServiceWorkerGlobalScope 对象,则将请求的service-workers 模式设置为“none”。
Service Worker 规范中还有许多其他场景也描述了何时将 service-workers 模式设置为“none”,例如在执行网络请求时作为importScripts()
推荐阅读
- javascript - 在什么情况下 window.location.search 是未定义的?
- javascript - 数量平方的问题
- python - 使用 Python 3 转换为全角字符,Window 上的 Unicode 错误
- python - 根据 Pandas Dataframes 中的 True/False 确定均值
- pytorch - 使用 Autograd .backward() 函数计算 Pytorch 模型前向传递中的中间值
- javascript - 如何在服务器上混淆 js 脚本
- azure - 在 Azure DevOps 中跨项目创建查询
- android - 带有手势导航的 Bottomsheetbehavior 行为异常
- css - 反应:如何使输入仅与提供的文本量一样宽?
- angular - 子路由路径可以在 Angular 9 路由中的辅助/辅助路由中工作吗?