Fetch event not getting executed in very first time page load in service worker because client not registered(由于客户端未注册,首次在服务工作器中加载页面时未执行FETCH事件)
问题描述
嗨,我在服务人员中面临着一种有线行为。在清除所有缓存加载后,页面服务工作者将所有内容加载到缓存API。然后我离线并重新加载页面,该页面没有加载。我再次上线并加载页面,然后离线加载页面,这一次页面加载正确。我不知道为什么这种行为与服务人员的等待时间有关,如何解决这个问题。
经过几次调试后,我发现我的FETCH代码在第一次加载页面时不会执行。从第二个页面加载开始,它就会获得点击
我的示例应用程序托管在这里https://ajeeshc.github.io/#/comments
我的服务人员文件位于here
完整演示代码位置here
请帮帮我,我真的处于危急状态。 我几乎没有阅读到注册服务工作者延迟导致此问题的原因如何解决这个问题?
以下是我的服务人员注册码。if ('serviceWorker' in navigator) {
navigator.serviceWorker
.register('service-worker.js', { scope: './' })
.then(function (registration) {
console.log("Service worker registered - from the 24 ", registration)
registration.addEventListener('updatefound', () => {
newWorker = registration.installing;
newWorker.addEventListener('statechange', () => {
switch (newWorker.state) {
case 'installed':
if (navigator.serviceWorker.controller) {
showUpdateBar();
}
break;
}
});
});
})
.catch(function (err) {
console.log("Service Worker Failes to Register", err)
})
navigator.serviceWorker.addEventListener('message', function (event) {
document.getElementById("cache-generic-msg").style.display = "block";
console.log("Got reply from service worker: " + event.data);
});
let refreshing;
navigator.serviceWorker.addEventListener('controllerchange', function () {
if (refreshing) return;
window.location.reload();
refreshing = true;
});
}
推荐答案
经过几次研究后,我发现了我在这里遗漏的东西。 在我的代码第一次加载时,服务工作者没有注册到客户端。它不能调用任何FETCH事件。如果您看到应用程序选项卡,您可以检查客户端是否已注册。如果它注册了,您将在那里有名称,否则它将为空
现在如何在第一次加载时使用
注册客户端self.clients.Claim()
请找到下面的代码
self.addEventListener('activate', (event) => {
console.info('Event: Activate');
event.waitUntil(
self.clients.claim(),
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cache) => {
if (cache !== cacheName) {
return caches.delete(cache);
}
})
);
})
);
});
这篇关于由于客户端未注册,首次在服务工作器中加载页面时未执行FETCH事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:由于客户端未注册,首次在服务工作器中加载页面时未执行FETCH事件
基础教程推荐
- 我什么时候应该在导入时使用方括号 2022-01-01
- 动态更新多个选择框 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01