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

如何使用serviceWorker缓存ajax响应

于鸿博
2023-03-14

我调用服务器数据通过使用ajax在index.html.它是完美的获取这些数据。现在,我正在和服务人员一起工作。我可以缓存所有的静态资产(图像,js,css),并在Chrome开发工具的应用程序选项卡中的缓存存储中检查这些缓存的资产。我可以在网络选项卡中看到这些资产也被缓存(磁盘缓存)。

现在,我想使用ServiceWorker缓存这些ajax响应(图像文件数组)。在“网络”选项卡中,我可以看到它正在调用未缓存的url(类型:xhr)。到目前为止,我已经尝试获取url并缓存这些url,但无法做到这一点。

这是我在索引中的ajax调用。html

    <script type="text/javascript">
       $(document).ready(function () {
          var url = 'index.cfm?action=main.appcache';
            $.ajax({
                type:"GET",
                url: url,
                data: function(data){
                var resData = JSON.stringify(data);
            },
            cache: true,
            complete: doSomething
            })
});

function doSomething(data) {
    console.log(data.responseText);
}
</script>

以下是我的serviceWorker获取事件:

    self.addEventListener('fetch', (event) => {

  if (event.request.mode === 'navigate') {
    event.respondWith((async () => {
      try {
        const preloadResponse = await event.preloadResponse;
        if (preloadResponse) {
          return preloadResponse;
        }
        const normalizedUrl = new URL(event.request.url);
        if(normalizedUrl.endsWith === 'index.cfm?action=main.appcache'){
           const fetchResponseP = fetch(normalizedUrl);
           const fetchResponseCloneP = fetchResponseP.then(r => r.clone());
          event.waitUntil(async function() {
           const cache = await caches.open(precacheName);
           await cache.put(normalizedUrl, await fetchResponseCloneP);
            }());
          return (await caches.match(normalizedUrl)) || fetchResponseP;
        }
        const networkResponse = await fetch(event.request);
        return networkResponse;
      } catch (error) {
        console.log('Fetch failed; returning offline page instead.', error);

        const cache = await caches.open(precacheName);
        const cachedResponse = await cache.match(offlineDefaultPage);
        return cachedResponse;
      }
    })());
  }
});

请帮助我缓存响应需要哪些更改。

共有1个答案

葛安和
2023-03-14

您的fetch事件处理程序

if (event.request.mode === 'navigate') {
  // ...
}

这意味着只有当传入的getch事件是针对导航请求时,它内部的代码才会执行。只有首次加载页面时对超文本标记语言文档的初始请求才是导航请求。对其他子资源的AJAX请求不是导航请求。

如果除了导航请求的逻辑之外,还想缓存对index.cfm?action=main.appcache的请求,可以在第一个语句之后添加另一个if语句,并检查该URL:

self.addEventListener('fetch', (event) => {
  if (event.request.mode === 'navigate') {
    // ...
  }

  if (event.request.url.endsWith('index.cfm?action=main.appcache')) {
    // Your caching logic goes here. See:
    // https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook#serving-suggestions
  }
});
 类似资料:
  • 我想创建一个网站,即使当它的服务器离线时也可以工作——我发现这就是服务工人的目的。 当我重新加载带有service worker且没有连接的页面时,它工作正常。但是,轮班重新加载(例如,绕过缓存)会解除服务工作人员的防护,并出现“无法连接到服务器”错误。 我的问题是-我是否可以以某种方式防止轮班重新加载(shift f5、ctrl f5等)破坏服务人员,或者至少在不恢复连接的情况下使其恢复?

  • 我有从我的网页生成的AJAX POST请求,可能有多个POST请求具有相同的POST数据。但是响应可能会有所不同,我希望确保我没有得到这些请求的缓存响应。我需要每个请求点击网页。 我假设对POST请求的响应不会被缓存,这对吗?

  • 根据 workbox 文档,应将跨域请求配置为确保正则表达式与 URL 的开头匹配。但是,它不起作用。 服务人员代码如下所示。 在页面中,来自同源资源的响应被缓存,但来自< code > https://a248 . e . akami . net 的响应不被缓存。 我的配置有什么问题吗?还是这是一个工作箱3.0.0错误?

  • 问题内容: 我正在使用Ajax根据某些ID从服务器检索数据,以执行自动建议功能。但是,当我提交表单并更新数据库时,“自动建议”字段应该不再包含此ID的任何内容,但仍会从其缓存中检索数据。有谁知道如何清除缓存并在每次按下按钮时发出Ajax发送请求以从服务器获取最新数据?请帮助我整个星期都坚持不下去,找不到解决方案。 例如:当ID字段为00001时,自动建议字段将为1,2,3。在我提交表单并更新数据库

  • 问题内容: 当我单击链接的内容设置为div innerHTML时,我具有此功能,我在jquery ajax中设置了属性,但是如果我再次单击该链接,则不会显示任何缓存,而ajax函数仍将到达服务器端并到达我困惑的相同内容实际上是启用缓存的,我应该怎么做才能使其工作? 问题答案: 是默认值,并不总是从缓存中获取内容。浏览器上项目的可缓存性取决于: 从原始Web服务器返回的响应头。如果标题指示不应缓存内

  • 问题内容: 我现在有点泡菜。我正在构建一个将从CGI后端获取数据的网页。我无法控制CGI后端,也无法控制服务器(因此无法控制mod_headers或mod_expires)。同样,由于脚本的参数,我无法向每个请求附加唯一值(例如’&089u0af0d98)。使用XmlHttpRequest对象的请求是AJAX。我尝试设置“ If-Modified-Since”和“ Cache-Control”请求