这是关于在服务工作者内部处理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()
的一部分执行网络请求时