2016-01-13 49 views
1

我有一个(理想情况下)安全登录对象,我想保留在服务工作者上下文中,但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之后的某个点应该从内存中删除。然而,上述情况至少在我可以猜测的任何注销事件中移除至少十秒钟。

所以我有两个问题。什么可能会导致这种情况,以及将持久对象与服务工作者脚本关联的最佳实践是什么,而不进行序列化并且最好不发送到客户端上下文?

回答

4

the spec:

服务工作者的寿命依赖于事件的执行生命周期,而不是由服务人员客户的ServiceWorker对象保存引用。用户代理可以随时终止服务人员在处理事件时没有事件来处理或检测异常操作,例如无限循环和超过时间限制的任务(如果有的话)。

所以,服务人员只能依靠他们的状态保持足够长的时间来处理事件。他们绝对不会,只要他们是registered with clients.


用于与服务工作者脚本关联,没有连载和最好不发送到客户端上下文持久化对象什么是最好的做法住?

the Cache API.

+3

而索引资料可作为很好地不依赖于缓存API坚持非请求/响应对。 – Salva

+0

我意识到我试图用状态来存储我应该存储在内存中的东西,换句话说,这是我带来这个问题的糟糕的设计选择。现在改用indexedDB。 –

相关问题