0

我的前端代码中有以下代码:

    const messageChannel = new MessageChannel();

    navigator.serviceWorker.controller.postMessage(
      {
        type: 'INIT_PORT',
      },
      [messageChannel.port2],
    );

这在我的服务人员内部:

let getVersionPort;

self.addEventListener('message', (event) => {
  if (event.data && event.data.type === 'INIT_PORT') {
    getVersionPort = event.ports[0];
  }
});

首先,它创建了我的 messageChannel,然后用这个频道向我的 serviceWorker 发布一条消息。此代码在我的应用程序启动时运行。

接下来,我的服务工作者注册消息侦听器,一旦发送了来自客户端的消息,它会检查它并且它是一个端口,因此它将它分配给getVersionPort。我可以使用getVersionPort与浏览器进行通信,并且它可以完美运行,直到我的 serviceWorker 被浏览器停止。在它停止然后重新激活之后,我们无法控制它,它的代码从上到下运行并且getVersionPort变得未定义。

如何解决这个问题?即使浏览器挂起并重新激活它,如何强制 serviceWorker 保持getVersionPort的值?

4

1 回答 1

0

你的建议是不可能的。每当服务工作者停止然后重新启动时,属于 的变量都会ServiceWorkerGlobalScope被丢弃,您需要在启动时重新填充它们以确保它们可用。

此外,我很确定尝试将 a 序列化MessagePort到 IndexedDB 并在以后重用它们是行不通的,因此您需要在每次启动时在服务工作者和客户端页面之间建立“新”消息连接.

于 2021-06-16T16:46:57.957 回答