由于客户端未注册,首次在服务工作器中加载页面时未执行FETCH事件 [英] Fetch event not getting executed in very first time page load in service worker because client not registered

查看:22
本文介绍了由于客户端未注册,首次在服务工作器中加载页面时未执行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事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆