我有一个服务人员。这是安装事件:
self.addEventListener('install', function (event) {
console.log('Installing Service Worker ...', event);
return self.skipWaiting()
.then(() => caches.open(CACHE_STATIC_NAME))
.then(function (cache) {
return cache.addAll([
'./file1.html',
'./file2.html'
])
})
});
由于某种原因,当我编辑服务工作线程代码并更新服务工作线程文件 URL 中的查询参数时,它会安装但不会激活(根据 Chrome DevTools)——即使我已经调用self.skipWaiting()
.
奇怪的是,如果我进入控制台,进入服务工作者的范围并输入self.skipWaiting()
我自己,它立即激活。
我已经花了好几个小时试图弄清楚到底发生了什么,但我完全被难住了。我在这里缺少什么吗?
旧的软件在仍在运行任务时可能不会停止 - 例如,如果它有一个长时间运行的获取请求(例如服务器发送事件/事件源,或获取流;尽管我不认为 websockets 会导致这种情况,因为软件会忽略它们我认为)。
然而,我发现浏览器之间的行为有所不同。 Chrome 似乎会在现有任务运行时等待(因此,skipWaiting 会失败...),但 Safari 似乎会终止该任务并激活新的软件。
测试这是否导致问题的一个好方法是在请求skipWaiting(以终止网络连接)后立即终止服务器。 (仅在开发工具中单击“离线”似乎并不会终止所有正在运行的连接,例如 EventSource 仍保持运行。)
您可以让软件忽略某些路由(如下),或者您可以尝试强制终止请求(也许使用 AbortController)。
self.addEventListener('fetch', function(event) {
const { method, url } = event.request;
if(event.request.method !== "GET") return false;
if(url === "https://example.com/poll") return false;
event.respondWith(
caches.match(match).then(function(response) {
return response || fetch(event.request);
})
);
});
这个规范中skipWaiting的流程是:
https://w3c.github.io/ServiceWorker/#try-activate-algorithm https://w3c.github.io/ServiceWorker/#try-activate-algorithm
但我不太清楚浏览器在激活新软件之前是否应该等待任务或终止它们(或将它们转移到新软件?);正如所提到的,目前浏览器之间的工作方式似乎有所不同......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)