【问题标题】:Is the ononline event supported in a service worker?Service Worker 是否支持在线活动?
【发布时间】:2017-09-26 03:57:03
【问题描述】:

document.ononline 是浏览器中可用的事件。是否有服务工作者代码支持的等效事件,它没有 DOM 访问权限?

我看到的所有示例代码都会在处理请求的过程中检查网络状态。为了将本地更新提交到服务器或云,最好立即响应网络可用性。

我能找到的最好的文档是https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope,它只列出了这些事件:

  • 开启激活
  • onfetch
  • 安装时
  • onmessage
  • onnotificationclick
  • onnotificationclose
  • 推送
  • onpush 订阅更改
  • 同步

其中,sync 似乎最符合我的要求,但它取决于 SyncManager 的使用,并且其文档充满了反对在生产代码中使用的警告。

【问题讨论】:

    标签: service-worker service-worker-events


    【解决方案1】:

    我不确定 SW 中是否有可用的事件。应该有人证实这一点。

    您可以通过在页面的 JS 中使用在线事件处理程序逻辑来解决此问题,该逻辑可以通知 SW 连接性更改。这也是在 UI 中为用户处理任何通知的合适位置。

    特别是:

    • SW 注册一个 onmessage 处理程序
    • 客户端/页面 JS 为在线事件注册一个处理程序
    • 当连接改变时,处理程序通过 postMessage API 通知 SW
    • SW 收到来自客户端的连接更改消息并采取相应措施

    postMessage API 非常有用,基本上可以用来在页面和 SW 之间传递任何数据。请注意,我的提案没有任何特殊信息,只需传递 { "new_status": "online" } 等内容即可。

    【讨论】:

      【解决方案2】:

      这是一个老问题,但我目前对此很感兴趣。我发现,虽然 MDN 目前在(共享)WorkerGlobalScope 中 says it's supported,但我现在正坐在我的服务工作者中的断点上使用 Chrome DevTools 和 ServiceWorkerGlobalScope 没有“在线”属性。但是,“navigator.onLine”指示器似乎可以工作。您至少可以检查并立即返回缓存的响应。

      我为在线和离线事件添加了事件侦听器,但均未触发,因此似乎不受支持。我能想到不支持它的合理理由,但听听真实的理由会很有趣。

      【讨论】:

      • Crikey,太久了,我什至不记得写了这个问题,直到我读到它。但这是一个很有前途的调查路线。感谢您推荐 navigator.online。轮询的麻烦在于,要么你频繁地轮询它,这在移动设备中是反社会的,要么你错过了狭窄的窗口。但这总比没有好。我认为需要一种在网络可用时将一些代码排队执行的方法;你可能会说在 LAN 上唤醒。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2017-12-22
      • 1970-01-01
      • 2019-12-19
      • 2017-12-31
      相关资源
      最近更新 更多