服务工作者获取事件:为什么没有无限循环



这是关于在服务工作者内部处理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()(即当全局对象为ServiceWorkerGlobalScope时(永远不会触发fetch处理程序。

决定这种行为的机制来自Fetch规范,第5.6节,描述fetch(),步骤5:

如果请求的客户端的全局对象是ServiceWorkerGlobalScope对象,则将请求的服务工作者模式设置为";没有";。

Service Worker规范中还有许多其他场景,它们也描述了当Service Worker模式设置为";无";,类似于作为importScripts()的一部分执行网络请求时

最新更新