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

服务人员加载新页面时出错,原因是什么?

司空学智
2023-03-14

在教程的帮助下,我编写了一个服务人员:

var CACHE = 'cache-and-update';

self.addEventListener('install', function (evt) {
    console.log('The service worker is being installed.');

    evt.waitUntil(precache());
});

self.addEventListener('fetch', function (evt) {

    evt.respondWith(fromCache(evt.request));

    evt.waitUntil(update(evt.request));
});

function precache() {
    return caches.open(CACHE).then(function (cache) {
        return cache.addAll([
            // Nothing.
        ]);
    });
}

function fromCache(request) {
    return caches.open(CACHE).then(function (cache) {
        return cache.match(request).then(function (matching) {
            return matching || Promise.reject('no-match');
        });
    });
}

function update(request) {
    return caches.open(CACHE).then(function (cache) {
        return fetch(request).then(function (response) {
            return cache.put(request, response);
        });
    });
}

它总是先从缓存服务,然后获取所有文件,并在页面重新加载时更新。

Service Worker在我的服务器上的每个超文本标记语言文件中都是这样注册的:

<script>
    navigator.serviceWorker.register('https://www.example.com/sw.js', {
        scope: '../'
    });
</script>

现在的问题是,当我转到一个尚未缓存的页面时,它首先向我显示默认的ChromeERR\u FAILED错误(以及“不匹配”promise拒绝)。

软件会在向客户机显示错误页面的同时获取它,并在重新加载时再次工作(因为它是从缓存提供服务的)。

为什么会发生这种情况?当没有可用的缓存版本时,如何让服务人员从服务器加载页面?

共有1个答案

裘臻
2023-03-14

如果在缓存中没有找到文件,您拒绝了promise,您应该获取它然后缓存它,而不是返回Promise.reject('no-Match'),并且您不需要evt.wait在这种情况下直到

这是一个工作服务人员的完整片段。如果一个请求与缓存中的任何内容都不匹配,我们从网络中获取它,将其发送到页面,同时将其添加到缓存中。

let cacheName = 'cache-v1';

self.addEventListener('install', (e) => {

  let cache = caches.open(cacheName).then((c) => {
    c.addAll([
      // nothing
    ]);
  });

  e.waitUntil(cache);
});

self.addEventListener('fetch', function (event) {

  event.respondWith(

    caches.open(cacheName).then(function (cache) {
      return cache.match(event.request).then(function (response) {
        return response || fetch(event.request).then(function (response) {
          cache.put(event.request, response.clone());
          return response;
        });
      });
    })

  );

});
 类似资料:
  • 演示视频:https://www.youtube.com/watch?v=UBfnvx6jC_A 我学习了Udacity的离线Web应用程序课程,以便让我的应用程序离线工作。这是我的密码: 主要的js 服务人员。js 当我处于一个安装了服务人员并处于活动状态,并且缓存了我所有的东西的状态时,就会出现问题。当我打开开发工具并在Chrome中签入“重新加载时更新”时,如果我重新加载: 页面看起来相同,

  • 我使用这个众所周知的模式来显示服务工作者更新准备好安装时的通知(此代码进入网页,当然不是服务工作者代码): 当然,该代码是有效的,因为如果准备好安装新版本的服务辅助角色,它会在网页上显示通知。 问题是,如果在该点重新加载页面,则不再显示通知,因为如果安装了新的服务工作人员并等待激活,则不再触发事件。 因此,通知只出现一次,当安装了新的服务工作人员并等待激活并开始控制页面时,但是一旦页面重新加载,通

  • 本文向大家介绍https页面加载http的资源会导致页面报错的原因是什么?怎么解决?相关面试题,主要包含被问及https页面加载http的资源会导致页面报错的原因是什么?怎么解决?时的应答技巧和注意事项,需要的朋友参考一下 https地址中,如果加载了http资源,浏览器将认为这是不安全的资源,将会默认阻止。 解决方法 : h5页面中使用js自己加载协议情况,如在body onload='xx()

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

  • 硬重装或硬刷新(例如,Chrome中的移位重装)似乎绕过了服务辅助角色。 例如,加载一个服务人员控制的页面,如https://airhorner.com/或https://wiki-offline.jakearchibald.com/,在开发工具中将网络设置为“离线”,然后重新加载页面会导致一个破碎的“没有互联网连接”页面。正常的重新加载会显示缓存的页面。) 有没有办法防止这种情况发生,或者在设备

  • 我一直在阅读《html5rocks服务工作者简介》一文,并创建了一个基本的服务工作者,它可以缓存页面、JS和CSS,并按预期工作: 当我对CSS进行更改时,由于服务人员正在从缓存中正确返回CSS,因此不会拾取此更改。 我陷入困境的地方是,如果我要更改HTML、JS或CSS,我如何确保服务人员可以从服务器加载较新版本,而不是从缓存加载?我曾尝试在CSS导入上使用版本戳,但似乎不起作用。