Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Service worker 在注册事件完成之前调用service worker安装事件_Service Worker_Progressive Web Apps - Fatal编程技术网

Service worker 在注册事件完成之前调用service worker安装事件

Service worker 在注册事件完成之前调用service worker安装事件,service-worker,progressive-web-apps,Service Worker,Progressive Web Apps,我已将安装事件附加到服务人员,如下所示。但在注册事件完成之前触发的安装事件。请参阅下面的代码片段和控制台日志 我关心的是如何在注册事件完成之前触发安装事件 if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./service-worker.js',{scope : '/'}).then(function(registration) { // Registration was successful

我已将安装事件附加到服务人员,如下所示。但在注册事件完成之前触发的安装事件。请参阅下面的代码片段和控制台日志

我关心的是如何在注册事件完成之前触发安装事件

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('./service-worker.js',{scope : '/'}).then(function(registration) {
    // Registration was successful
    console.log('ServiceWorker registration successful with scope: ', registration.scope);
  }).catch(function(err) {
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err);
  });
}


var cacheName = 'V-1';
var filesToCache = [
  '/', '/index.html',
  '/css/all.css', '/css/material.min.css',
  '/js/all.js', '/js/material.min.js',
  '/images/service-worker-1.png','/images/service-worker-2.png','/images/service-worker-3.png',
];

self.addEventListener('install', function(e) {
  console.log('[ServiceWorker] Installing');
  e.waitUntil(
    caches.open(cacheName).then(function(cache) {
      console.log('[ServiceWorker] Caching app shell');
      return cache
              .addAll(filesToCache) //this is atomic in nature i.e. if any of the file fails the entire cache step fails.
              .then(() => {console.log('[ServiceWorker] App shell Caching  Successful');})
              .catch(() => {console.log('[ServiceWorker] App shell Caching  Failed');})
    })
  );
});

navigator.serviceWorker.register()不是事件。它是一个函数,返回一个promise,然后promise将使用与注册相对应的对象进行解析

实际的服务工作者逻辑在不同的线程/进程中执行,服务工作者处理的生命周期事件(如
安装
事件)独立于注册服务工作者的网页发生。您在
console.log()中看到的是预期的输出

如果要从网页跟踪服务工作者的状态,可以向
ServiceWorkerRegistration
对象添加事件侦听器。这里有一个例子


如果您想编写代码,使您的网页等待有一个活动的服务工作人员后再执行某些操作,则可以利用此承诺。

navigator.serviceWorker.register()
不是事件。它是一个函数,返回一个promise,然后promise将使用与注册相对应的对象进行解析

实际的服务工作者逻辑在不同的线程/进程中执行,服务工作者处理的生命周期事件(如
安装
事件)独立于注册服务工作者的网页发生。您在
console.log()中看到的是预期的输出

如果要从网页跟踪服务工作者的状态,可以向
ServiceWorkerRegistration
对象添加事件侦听器。这里有一个例子


如果您想编写代码,使您的网页等待有现役服务人员后再采取行动,您可以利用该承诺。

您的问题是什么?@abraham我已更新了描述。如何在注册事件完成之前触发安装事件。您有什么问题?@abraham我已经更新了描述。如何在注册事件完成之前触发安装事件。您能否详细解释一下为什么在注册完成之前触发service worker安装事件?我在这里感到困惑。把注册过程想象成一个网页,告诉浏览器“这是我的服务人员JavaScript的位置”。一旦浏览器知道从哪里获取JS,注册就完成了。实际下载和执行软件代码的过程发生在注册之后。
navigator.serviceWorker.register()
返回的承诺在软件代码开始执行后的某个时间点解析,但由于我们在这里讨论的是异步多线程代码,确切的时间可能很难确定。感谢您的详细解释:)您能详细解释一下为什么在注册完成之前就触发了service worker安装事件吗?我在这里感到困惑。把注册过程想象成一个网页,告诉浏览器“这是我的服务人员JavaScript的位置”。一旦浏览器知道从哪里获取JS,注册就完成了。实际下载和执行软件代码的过程发生在注册之后。
navigator.serviceWorker.register()
返回的承诺在软件代码开始执行后的某个时间点得到解决,但由于我们在这里讨论的是异步多线程代码,因此很难确定确切的时间。感谢您的详细解释:)