我的前端代码中有以下代码:
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的值?