self.skipWaiting() 在 Service Worker 中不起作用

2024-01-29

我有一个服务人员。这是安装事件:

self.addEventListener('install', function (event) {
    console.log('Installing Service Worker ...', event);

    return self.skipWaiting()
    .then(() => caches.open(CACHE_STATIC_NAME))
    .then(function (cache) {
        return cache.addAll([
            './file1.html',
            './file2.html'
        ])
    })
});

由于某种原因,当我编辑服务工作线程代码并更新服务工作线程文件 URL 中的查询参数时,它会安装但不会激活(根据 Chrome DevTools)——即使我已经调用self.skipWaiting().

奇怪的是,如果我进入控制台,进入服务工作者的范围并输入self.skipWaiting()我自己,它立即激活。

我已经花了好几个小时试图弄清楚到底发生了什么,但我完全被难住了。我在这里缺少什么吗?


旧的软件在仍在运行任务时可能不会停止 - 例如,如果它有一个长时间运行的获取请求(例如服务器发送事件/事件源,或获取流;尽管我不认为 websockets 会导致这种情况,因为软件会忽略它们我认为)。

然而,我发现浏览器之间的行为有所不同。 Chrome 似乎会在现有任务运行时等待(因此,skipWaiting 会失败...),但 Safari 似乎会终止该任务并激活新的软件。

测试这是否导致问题的一个好方法是在请求skipWaiting(以终止网络连接)后立即终止服务器。 (仅在开发工具中单击“离线”似乎并不会终止所有正在运行的连接,例如 EventSource 仍保持运行。)

您可以让软件忽略某些路由(如下),或者您可以尝试强制终止请求(也许使用 AbortController)。

self.addEventListener('fetch', function(event) {
  const { method, url } = event.request;
  if(event.request.method !== "GET") return false;
  if(url === "https://example.com/poll") return false;

  event.respondWith(
    caches.match(match).then(function(response) {
      return response || fetch(event.request);
    })
  );
});

这个规范中skipWaiting的流程是:

https://w3c.github.io/ServiceWorker/#try-activate-algorithm https://w3c.github.io/ServiceWorker/#try-activate-algorithm

但我不太清楚浏览器在激活新软件之前是否应该等待任务或终止它们(或将它们转移到新软件?);正如所提到的,目前浏览器之间的工作方式似乎有所不同......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

self.skipWaiting() 在 Service Worker 中不起作用 的相关文章

随机推荐

  • 回显 jpassword 字符一次然后隐藏它

    在我的 swing 应用程序中 我想回显 jpassword 字段字符一段时间 1 秒 然后再次隐藏它 我想在用户输入字符后逐个字符地执行此操作 当用户输入字符时 显示它 然后隐藏它 然后对于所有输入字符重复此操作 有人可以告诉我这是否可能
  • XSLT 运行速度太慢

    我有大约 100 个 XML 文件 我想将它们转换为另一个具有更好结构的文件 本示例将其转换为 CSV 但我还有一个变体 可以将其转换为更好的 XML 格式与我无关 我看到有很多这样的问题 但我发现这些例子很难适应 因为问题不是样式表不起作
  • 在 Flutter 中,如何在本机文件资源管理器中为用户打开文件夹,以便用户可以浏览其文件/文件夹

    我正在 flutter 中构建一个文件储物柜应用程序 它可以锁定文件和文件夹 当用户解锁文件夹时 我希望我的应用程序显示一个在本机文件资源管理器中查看文件夹内容的选项 有什么办法可以实现这个功能吗 提前致谢 您可以针对您提到的用例尝试此包
  • 在具有特定约束的滚动视图中显示图像(使用自动布局)

    我想在视图控制器中显示标题和图像下方 我的限制是 标签可以位于屏幕顶部 50 像素处 标签可以有一行或多行 图像可以位于我的标签的 50 像素处 图像必须具有屏幕的宽度 滚动视图必须根据所有这些元素的大小进行滚动 我有一个带有滚动视图的视图
  • 在java中读取Zip文件内容而不解压

    我有 byte zipFileAsByteArray This zip file has rootDir Folder1 first txt Folder2 second txt PictureFolder image png 我需要的是获
  • END事务和COMMIT事务的区别

    我正在尝试使用 java 来模拟数据库恢复子系统 但是 我有以下问题 每当发出开始交易时 是否总是需要有一个结束交易 就像下面的例子 b1 Begin txn 1 r1 X Read item X using txn 1 e1 End tx
  • UpdateSourceTrigger=PropertyChanged 和转换器

    我有一个简单的Converter将 符号添加到输入的正数中TextBox 当输入号码时 我想启动一些操作 但我不想等到TextBox失去焦点 我想在用户输入文本时立即更新绑定 a 的默认行为TextBox是当用户离开该框时 绑定源会更新 U
  • 在同一个项目中使用 Material Ui 和 Tailwind 是一个好习惯吗

    I am using next js with tailwind css and i somehow need some of the ready to use components in my project so i can save
  • 打开多个 VSCode 窗口时在 2 个 VSCode 窗口之间切换的快捷方式

    我使用的是 Mac 我打开了几个 VSCode 窗口 我只想在 2 个 上次查看的 窗口之间切换 有谁知道这样做的键盘快捷键是什么 我尝试了 command 但它一一浏览了所有打开的 VSCode 窗口 选项 选项卡也是如此 我尝试了 co
  • 如何使用java查找操作系统驱动器? [复制]

    这个问题在这里已经有答案了 我们如何用java编写代码来找出安装操作系统的驱动器号 你可以从环境中得到它 System getenv SystemDrive
  • Expo 重新加载无法在 Linux 上运行(使用 Android 设备)

    我的世博会应用程序遇到问题 遗憾的是它不接受我的改变 实时重新加载 热重新加载不起作用 当我摇动设备并按 重新加载 时 我的应用程序会重新加载 但更改不会出现 我已经做了什么 重新安装守望者 delete node modules and
  • 动态波浪路径/边框

    我需要构建一些东西 但我的数学能力达不到标准 我想要构建的是类似的东西这个演示 https www html5canvastutorials com advanced html5 canvas colorful wave effect 但可
  • 当“a”和“b”都是整数时,为什么“a ^ b”返回数字?

    给定两个整数 a lt 1L b lt 1L 正如我所期望的 将它们相加 相减或相乘也会得到一个整数 class a b 1 integer class a b 1 integer class a b 1 integer 但除以它们会得到一
  • 性能:调用模板与应用模板

    在XSLT处理中 apply template和call template之间有性能差异吗 在我的样式表中有很多情况我可以使用其中任何一个 哪个是最好的选择 与所有性能问题一样 答案取决于您的特定配置 特别是您正在使用的 XSLT 处理器
  • Python:快速而肮脏的数据类型(DTO)

    很多时候 我发现自己正在编写一些琐碎的数据类型 例如 class Pruefer def init self ident maxNum float inf name self ident ident self maxNum maxNum s
  • 具有多租户的 Firestore 规则?

    The Firebase 规则文档 https firebase google com docs firestore security rules conditions建议比较经过身份验证的用户令牌的构建条件 即request auth 与
  • 理解mongodb解释

    我发起了一个查询并尝试在 mongo 控制台上解释它并得到了 isMultiKey true n 8 nscannedObjects 17272 nscanned 17272 nscannedObjectsAllPlans 21836 ns
  • Dask 中的二维布尔索引

    我想使用 Dask 进行二维索引 这是该任务的示例 array1 xr DataArray 1 3 4 7 6 4 15 2 chunk 2 array2 xr DataArray 1 3 4 9 1 4 3 2 chunk 2 array
  • 从 Dicts 获取值时的 Python If then Else 样式

    我经常为下面的 if else 语法而苦苦挣扎 我希望有人能给我一些他们认为更清楚的意见 或者这是否违反了任何 Pythonism 我已经搜索过 但找不到任何东西 其中之一更好还是对 错 value None if value in som
  • self.skipWaiting() 在 Service Worker 中不起作用

    我有一个服务人员 这是安装事件 self addEventListener install function event console log Installing Service Worker event return self ski