【发布时间】:2021-08-27 22:39:36
【问题描述】:
我的前端代码中有以下代码:
const messageChannel = new MessageChannel();
navigator.serviceWorker.controller.postMessage(
{
type: 'INIT_PORT',
},
[messageChannel.port2],
);
这在我的 service worker 中:
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 的值?
【问题讨论】:
标签: javascript service-worker message-channel