Javascript 是什么导致服务工作者的全局上下文被重置?

Javascript 是什么导致服务工作者的全局上下文被重置?,javascript,service-worker,Javascript,Service Worker,我有一个(理想情况下)安全的登录对象,我想保存在服务工作者上下文中,但ServiceWorkerGlobalScope似乎被随机重置(Chrome47 Ubuntu) 要进行测试,在我插入的服务人员中: var iid = setInterval(function () { var now = performance.now(); return self.clients.matchAll().then(function(clients) { return Promise.all(

我有一个(理想情况下)安全的登录对象,我想保存在服务工作者上下文中,但ServiceWorkerGlobalScope似乎被随机重置(Chrome47 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
s之后,服务工作者应该在某个时候从内存中删除。然而,上述情况至少会在我能猜到的任何注销事件发生后的十秒钟内发生

所以我有两个问题。造成这种情况的原因是什么?对于持久化与服务工作者脚本关联的对象,最好不序列化,最好不发送到客户端上下文,最佳做法是什么

服务工作者的生命周期与事件的执行生命周期相关联,而不是服务工作者客户端对服务工作者对象的引用。在处理事件时,用户代理可以在任何时候终止服务工作人员,如果没有事件要处理,或者检测到异常操作,例如无限循环和任务超过了规定的时间限制(如果有的话)

因此,只能依靠服务人员保持足够长的状态来处理事件。他们肯定活不了多久


将对象持久化为与服务工作者脚本关联的对象,而不序列化,最好不发送到客户端上下文,最佳做法是什么

来自

服务工作者的生命周期与事件的执行生命周期相关联,而不是服务工作者客户端对服务工作者对象的引用。在处理事件时,用户代理可以在任何时候终止服务工作人员,如果没有事件要处理,或者检测到异常操作,例如无限循环和任务超过了规定的时间限制(如果有的话)

因此,只能依靠服务人员保持足够长的状态来处理事件。他们肯定活不了多久


将对象持久化为与服务工作者脚本关联的对象,而不序列化,最好不发送到客户端上下文,最佳做法是什么


还有

,IndexedDB也可以用来不依赖缓存API来持久化非请求/响应对。我意识到我试图使用状态来存储我应该存储在内存中的东西,换句话说,是我糟糕的设计选择导致了这个问题。现在改用indexedDB。indexedDB也可以用来不依赖缓存API来持久化非请求/响应对。我意识到我试图使用状态来存储在内存中的东西,换句话说,是我糟糕的设计选择带来了这个问题。现在改用indexedDB。