首页 > 解决方案 > 服务工作者获取事件:为什么没有无限循环?

问题描述

这是关于在服务工作者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()(在 之后||执行,但不会再次触发事件处理程序。为什么不?还有一些指向解释这一点的页面的链接将不胜感激。

标签: javascriptservice-worker

解决方案


如评论中所述,fetch()从服务工作者内部执行 a (即当全局对象为 时ServiceWorkerGlobalScope)永远不会触发fetch处理程序。

确定此行为的机制来自Fetch 规范,第 5.6 节,描述fetch(),第 5 步:

如果请求的客户端的全局对象是一个 ServiceWorkerGlobalScope 对象,则将请求的service-workers 模式设置为“none”。

Service Worker 规范中还有许多其他场景也描述了何时将 service-workers 模式设置为“none”,例如在执行网络请求时作为importScripts()


推荐阅读