1
    event.respondWith(caches.match(event.request).then(function (response) {
        if (response) {
            return response;
        }          
         //return fetch(event.reuqest, { credentials: 'include' });

        //event.respondWith(fetch(event.request, { credentials: 'include' }));
    }));

这是通过 serviceworkers 处理请求的常用代码,如果 url 在缓存中,则返回缓存响应或从服务器获取它。但我的疑问是关于 2 条注释行,我们需要使用其中之一来获取响应。

我的疑问是,当我event.respondWith(fetch(event.request, { credentials: 'include'用于获取页面时,出现以下错误

DOMException:无法在“FetchEvent”上执行“respondWith”:获取事件已被响应。

但是页面最终呈现,肯定浏览器最终获取响应,但是当我使用 sam 获取图像时,我得到了同样的错误,最重要的是没有获取图像。

如果我使用第二个选项return fetch(event.reuqest, { credentials: 'include' });,那么它适用于图像和页面。

我无法弄清楚该错误的原因是什么,以及为什么它对文件和页面的行为不同。

我的另一个疑问是,我真的需要这里的凭证参数吗,我添加它是因为我在 web 中看到的大多数实现都使用了它,但我观察到的是请求对象已经具有它的凭证属性,现在它并不总是

包括

有时是

同源

也。那么我是否会通过添加它来覆盖实际的凭证值。如果不是这种情况,那么是否包含它就没有区别。没关系。

但如果是其他方式,那么我们不应该覆盖凭证值,这可能会产生不好的副作用。

4

1 回答 1

2

您已经调用了event.respondWith,无需调用两次。

您的第一个电话将使用以下返回的承诺:

caches.match(event.request).then(function(response) {
  if (response) {
    return response;
  }

  return fetch(event.reuqest, { credentials: 'include' });
})

此承诺解决:

  • response, 如果请求在缓存中;
  • 调用返回的承诺fetch,否则。

返回的承诺fetch将解析为响应,然后将由 responseWith 使用。

于 2016-02-24T17:28:36.750 回答