从客户端中测试活动的服务工作者



在我的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(),那么可以忽略主动和控制之间的区别。

最新更新