在我的client.js
中,我用注册了一个服务工作者
var someVariable;
if('serviceWorker' in navigator) {
navigator.serviceWorker.register('./service-worker.js')
.then(function() {
console.log('Service worker registered.');
if(localStorage.someVariable) {
someVariable = JSON.parse(localStorage.someVariable);
};
});
};
现在,在我的client.js
代码下面,我想检查client.js
是否有一个活动服务工作者正在运行。
在service-worker.js
中这样做在某种程度上对应于对self.registration
的测试,因为self.registration.active
似乎不起作用。
然而,对于client.js
中的现役服务人员来说,什么是等效的测试?
navigator.serviceWorker.ready
重新运行Promise
,但我不知道这是否真的是我在/作为条件使用时所需要的。
您的选项
如果您想检查当前页面是否在某个服务人员的控制下,可以检查navigator.serviceWorker.controller
。如果当前页面不受服务工作者控制,则它将是null
,如果由服务工作者控制则设置为ServiceWorker
实例。
如果您想检查与给定ServiceWorkerRegistration
相关联的服务工作者是否在给定时间点处于活动状态,可以使用以下代码进行检查:
const registration = await navigator.serviceWorker.register('sw.js');
// Examine `registration.active` to see if, at the current point in time,
// there's an active service worker.
如果您想编写代码,等待,直到有任何活动的服务工作者与当前页面的服务工作者注册关联,那么await navigator.serviceWorker.ready
将为您执行此操作。
主动与控制
只需简要说明主动服务工作者和控制服务工作者之间的区别。服务工作者可以是活动的,但不能控制任何客户端页面——如果服务工作者不调用clients.claim()
,则这是第一次为给定作用域注册服务工作者时会发生的情况。
如果您在服务工作者中调用clients.claim()
,那么可以忽略主动和控制之间的区别。