清除注册
为避免之前的注册所带来的负面影响,可先清除之前的所有注册。下面的代码先清除注册后,再查看当前是否还有注册的项目。
async function unRegAll() {
return navigator.serviceWorker.getRegistrations()
.then(regs => {
let promises = [];
for (let reg of regs) {
pc.log('Find a registration, schedule to unregister...');
promises.push(reg.unregister());
}
return promises;
})
.then((promises) => {
if (promises.length > 0) {
return Promise.all(promises)
.then((dones) => {
pc.log('All previous registrations have been unregistered.');
return 'done';
});
} else {
pc.log('Find no previous registrations.');
return 'done';
}
});
}
async function listAll() {
let registrations = await navigator.serviceWorker.getRegistrations();
if (registrations.length !== 0) {
registrations.forEach(registration => pc.log(registration));
} else {
pc.log('Currently no registrations.');
}
}
let status = await unRegAll();
pc.log(status);
await listAll();
Service workers大量使用了异步机制,因此为确保清除注册在先,上面两个函数均用await进行了先后排序。
调用serviceWorker的getRegistrations返回所有的注册,然后取出每一个registration,调用其unregister方法来取消注册。
注意,当客户端取消注册后,为使其生效,需等待使用该服务的所有客户端(包括取消注册的客户端)都关闭相应提供ServiceWorker服务的网页后,才会生效。在开发阶段,最简单的方法是关闭浏览器,再重新打开浏览器并访问相应资源。