我有一个(理想情况下)安全登录对象我想保留在服务工作者上下文中,但ServiceWorkerGlobalScope似乎随机重置(Chrome 47 Ubuntu)。
要测试,在我插入的服务工作者中:
var iid = setInterval(function () {
var now = performance.now();
return self.clients.matchAll().then(function(clients) {
return Promise.all(clients.map(function(client) {
return client.postMessage({messageType: "canary", value: now})
}))
})
}, 1000);
在客户端:
navigator.serviceWorker.addEventListener("message", function(event) {
if (event.data.messageType = "canary") console.log(event.data.value)
});
客户端控制台的结果是:
⋮
147200.06500000003
148200.08000000002
149200.09000000003
1212.9800000000002
2212.5350000000003
3212.4700000000003
⋮
不幸的是,我仍然无法可靠地复制它。
据我所知,服务工作者应该在clients
对象不再返回任何Client
之后的某个时刻从内存中删除。但是,上述情况至少在我可以猜到的任何注销事件中删除了十秒钟。
所以我有两个问题。可能导致这种情况的原因,以及将对象与服务工作者脚本相关联的最佳实践,没有序列化,最好不发送到客户端上下文?
答案 0 :(得分:5)
服务工作者的生命周期与事件的执行生命周期相关联,而不是服务工作者客户端对ServiceWorker对象持有的引用。在处理事件时,用户代理可以在没有事件处理或检测到异常操作的任何时候终止服务工作者,例如无限循环和超出规定时限的任务(如果有的话)。
因此,只能依靠服务工作者来保持其状态足够长时间来处理事件。他们绝对不会活着registered with clients.
将对象与服务工作者脚本相关联的最佳实践是什么,没有序列化,最好不发送到客户端上下文?