【问题标题】:Is it reliable to unregister service worker on window.unload event?在 window.unload 事件上注销服务工作者是否可靠?
【发布时间】:2017-12-27 06:32:39
【问题描述】:

我正在使用这样的东西来注销我的服务人员:

window.addEventListener("unload", () =>{
     registration.unregister().then(function(successs) {
         if(successs){
             console.log("Unregister succesfull!");
         }
         else {
             console.log("unregister unsuccessfull!!");
         }
     });
});

由于unregister函数返回一个promise,看来unregister过程是asnyc。那么在卸载事件上进行注销是否可靠?

我已经在 Chrome 上进行了测试,它可以工作,但在规范或任何地方都找不到任何可以验证我所做的事情是否总是有效的东西。

更多信息

我知道在文档卸载时取消注册服务人员似乎很奇怪。但我没有使用服务工作者进行缓存或通知或其他 PWA 的东西。我用来提供在运行时生成的虚拟 HTML 页面。所以我只是打开一个带有一些虚拟 src 的 iframe 并开始拦截来自服务工作者的 iframe 的所有请求。我希望在用户关闭选项卡后取消注册此服务人员。

【问题讨论】:

  • 它可能会起作用,但是...您能详细说明您要解决的问题吗?使用仅在您离开当前页面之前保持注册状态的服务工作者听起来不太理想。
  • 有一个 github issue here,但我认为管理这样的 service worker 不是一个好主意。
  • 我不想使用 service worker 在 IndexedDB 中保存任何内容。我只想在用户关闭选项卡后清理服务人员。请参阅我的问题的更多信息部分

标签: javascript service-worker


【解决方案1】:

可以通过this找到一个工作示例查看从 TravelManager.html 调用的 RegisterServiceWorker.js 文件。

调用后我没有得到任何控制台输出,所以假设承诺没有解决?不管怎样,它有什么作用?恕我直言,Service Worker 的注册(本质上适用于 许多 客户端/页面)不应绑定到一个页面。

清单注册/声明功能似乎在那里?

你想让注销者做什么?

【讨论】:

  • 我只想清理服务工作者,因为我不是将它用于缓存和其他东西,而是用于提供我在运行时生成的虚拟页面
  • 我也喜欢这个主意,比如关闭文件、释放内存等等。我纠结的是 ServiceWorker 的范围以及他们与客户的 1:M 关系。也就是说,谁是客户端页面 A 来关闭客户端 B 可能使用/依赖的 SW,因为他在范围内。我想知道它是否表示将安装新版本的 SW 并且当前处于停顿状态?
  • 您可以假设每个选项卡都有一个新的服务工作者。所以其他标签不会受到注销的影响。
  • @tapananand 你是从哪里得出这个不正确的假设的?您熟悉“范围”和 Clients 对象吗?强调“S”
  • 我每次注册 Service Worker 时都会使用随机范围。因此,每个选项卡都会获得一个新的服务唤醒器实例。如果我错了,请纠正我。
【解决方案2】:

我不会将它与一个页面上的事件联系起来,否则在同一页面上打开多个选项卡将很难处理。就我个人而言,我会使用 setInterval 对客户端进行服务工作者查询,如果客户端数量降至零,请自行注销(使用 self.registration.unregister())。

编辑:事实证明,由于网络工作者最终被杀死,上述方法不起作用。我最终使用了上述策略,但不是 setInterval,而是每次站点关闭时都会向 service worker 发送一条消息,然后它会检查它还有多少客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    相关资源
    最近更新 更多