当前位置: 首页 > 知识库问答 >
问题:

为什么我的服务人员总是等待激活?

楚权
2023-03-14

我有个很基本的问题

我正在努力了解Service Worker的生命周期,或者更好地了解实际情况下初始化和更改状态的内容。

我现在有两个问题:

1-在<代码>chrome://inspect/#service-工人始终有2行ou 3行,显示所有服务工人都以相同的PID运行。为什么?为什么不止一个?

2-当我在刷新时检查我的服务人员时,我得到以下信息:

  • #566已激活并正在运行[停止]

这是什么意思?什么是566,什么是570?我想它们是sw的实例,但为什么有两个呢?为什么570还在等待?我必须做些什么来确保它将被注册、安装和激活?

3-一般问题

  • 在正常生命周期中,安装事件的结束是什么
  • 在正常生命周期中,什么触发激活事件

指数html

<script>
  if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
      navigator.serviceWorker.register('./sw.js')
      .then(function(registration) {
        // successful
        console.log('Success: ', registration);
      }).catch(function(err) {
        // registration failed
        console.log('Error: ', err);
      });
    });
  }
  </script>

sw.js

var cache_name = 'v1';

var cache_files = [
  './',
  './index.html',
  './style.css'
]

self.addEventListener('install', function(e){
  console.log('SW install:', e);
  e.waitUntil(
    caches.open(cache_name)
    .then(function(cache){
      console.log('cache', cache);
      return cache.addAll(cache_files);
    })
    .then(function(cache){
      console.log('Cache completed');
    })
  )
});

self.addEventListener('activate', function(event) {
  console.log('SW activate:', event);
});

self.addEventListener('fetch', function(e){
  console.log('SW fetch:', e.request.url)

  e.respondWith(
    caches.match(e.request)
    .then(function(cache_response){
      if(cache_response) return cache_response;

      return fetch(e.request);
    })
    .catch(function(err){
      console.log('Cache error', err)
    })
  );
});

谢谢!

共有1个答案

方永贞
2023-03-14

Chrome开发工具显示的id是内部的。只是想指出。所以他们用一个id来命名所有的服务人员。仅此而已。

同时拥有两个SWs的原因是,你有一个SWs,然后你重新加载页面,导航离开并返回,或者沿着这些路线,然后你得到了另一个SWs。但此时,当您“刚刚获得另一个”时,它还没有被激活,并且之前的软件仍在控制页面。当您从其他地方导航回站点时,新软件将控制以前的软件,刷新页面是不够的。基本上,这意味着关闭页面的所有选项卡和窗口,然后再次加载,然后新的软件接管。

新软件尚未接管的时间称为等待状态,发生在安装和激活之间。这可以通过调用self跳过。从软件的安装处理程序内部执行skipWaiting()。

此流程背后的基本思想是,页面不应由加载页面时未控制页面的软件控制–因此,对注册软件的站点的第一次访问将不受该软件控制,只有第二次激活该软件等。

您真的应该阅读这篇精彩的文章:服务人员生命周期

 类似资料:
  • 带有服务工作者的网站,托管https://121eddie.github.io/并在Chrome 66.0中运行。3359.181 /索引。html在每次加载时正确跟踪以下注册 }); 第一次运行时,/serviceWorker。js执行“激活”事件,正确获取缓存名称并缓存文件 在第二次运行时,不会触发“激活”(没有日志跟踪,没有获取)。 在第三次运行中,甚至不再触发“抓取”。这意味着脱机请求不被

  • 创建响应应用时,默认情况下会调用Service Worker。为什么使用服务工人?默认调用的原因是什么?

  • 这与渐进式Web应用程序中使用的serviceworker API有关。有人能帮我理解服务人员安装事件和激活事件之间的区别吗? 以下是我的理解, 安装事件是注册服务辅助程序后发生的第一个事件 除了上面的陈述,我的问题是两个事件之间到底有什么区别,它们都是一个接一个地运行的,如果是这样,为什么我们需要两个事件? 更新:共享可能有帮助的资源。我正在读这个。https://developers.goog

  • 我正在努力学习如何正确使用async Wait,但我对它有点共同的想法。 在片段中,我试图构建一个对象数组,其中包含我需要的关于我在组件中上传的文件的信息。问题是this.fileInfo中的对象并没有完全等待返回编码图像的promise,而是在我console.logthis.fileInfo时返回此输出: 如您所见,关键图像是一个值未定义的ZoneAwarePromise。你能帮我修一下吗?

  • 我发现了这个描述如何摧毁一名服务人员的回购协议。但我没有找到任何资源来描述工作人员何时应该销毁/卸载/注销自己。 当我开发网站时,我经常使用8080端口。我可以在有服务人员的站点X上工作,然后在没有服务人员的站点Y上工作,但是原来的和现在不正确的服务人员仍然存在。 服务人员决定卸载自身的逻辑有点复杂,因为我们希望: 允许服务工作人员脱机工作 是否有一个标准的机制或惯例?

  • 在下面的代码中,为什么主线程要等到子线程完成。 Driver.java ThreadRunner.java 调用“t.start()”后,在驱动程序类中,程序是否应该退出?我没有使用join,但主线程仍在等待,直到新旋转的“ThreadRunner”运行开始。这是因为在java中,主线程(由main方法启动)总是等待所有线程关闭吗?