Service Worker 获取事件:为什么没有无限循环?

这是关于在Service Workerfetch内部处理事件时的一些行为。


当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()了对(在||)之后的调用,但没有再次触发事件处理程序。为什么不?另外,一些解释这一点的页面链接将不胜感激。


至尊宝的传说
浏览 65回答 1
1回答

喵喔喔

正如评论中提到的,fetch()从服务工作者内部执行 a (即当全局对象为 时ServiceWorkerGlobalScope)永远不会触发处理fetch程序。决定此行为的机制来自Fetch 规范第 5.6 节,描述fetch()第 5 步:如果请求的客户端全局对象是 ServiceWorkerGlobalScope 对象,则将请求的service-workers 模式设置为“none”。Service Worker 规范中还有许多其他场景,也描述了何时将 service-workers 模式设置为“none”,例如执行网络请求作为importScripts()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript