当前位置: 首页 > 知识库问答 >
问题:

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

荣俊杰
2023-03-14

这是关于在服务工作者内部处理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()(就在|之后)会被执行,但不会再次触发事件处理程序。为什么不呢?另外,如果您能提供一些页面链接来解释这一点,我们将不胜感激。

共有1个答案

上官修文
2023-03-14

如注释中所述,从Service Worker内部执行getch()(即当全局对象为ServiceWorkerGlobalScope时)永远不会触发getch处理程序。

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

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

Service Worker规范中还有一系列其他场景,也描述了Service Worker模式设置为“无”的情况,例如作为importScripts()

 类似资料:
  • 我在尝试一个测试,我写了这个程序。。。 六羟甲基三聚氰胺六甲醚。。。在下面的代码中,我知道我用了“I”而不是“j”,所以为了解决这个问题,我用了这个 我在节目中遇到的问题是- 在上面的代码中,当我删除这个if块时- 这个节目无限期地进行。。。。。。。。。但当我再次放置这个if块时,程序在执行一段时间后自动终止。我也在这个链接上读到了这一点,但它展示了java的例子 它们显示了负值的原因,但在我的程

  • 在JavaScript中,我按住两个键,并且被完美触发。当我释放其中一个键时,被触发。到目前为止一切都很好。但是我仍然按住一个键,那么为什么没有被触发呢?我需要在我的游戏中发生这种情况。我做错了什么吗?这是预期的反应吗?有什么解决办法吗?

  • 本文向大家介绍什么是事件循环?相关面试题,主要包含被问及什么是事件循环?时的应答技巧和注意事项,需要的朋友参考一下 Node采用的是单线程的处理机制(所有的I/O请求都采用非阻塞的工作方式),至少从Node.js开发者的角度是这样的。而在底层,Node.js借助libuv来作为抽象封装层,从而屏蔽不同操作系统的差异,Node可以借助livuv来实现线程。下图表示Node和libuv的关系 Libu

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码

  • 我目前正在做一个JavaFX突围游戏,并建立了一个移动系统,该系统使用公共的userKeyInteraction方法,在我按下左右箭头键时设置蝙蝠对象的速度。这个方法看起来工作得很好,但是我也有一个keyReleased方法,当用户不再按任何一个箭头时,这个方法不仅对bat没有影响(当键被释放时它不会停止),而且根本检测不到keyReleased事件。 正如您在上面看到的,我已经使用debug.t

  • 问题内容: 我已经存储了一个in in 组件。我传递的和为从父到子。然而,如果在父母一些事件,被触发,因此,儿童被执行。 由于造成了无限循环 (因为它触发了子组件内部的setState()) ,所以我放置了条件。但这不能防止错误。 子组件即如下: 父组件即MonthToDate如下: 我想念什么? 另外,在收到in子组件之后,我想基于那个渲染另一个组件。例如component只能处理一种类型的。如