在 service worker 中捕获请求并用不同的图像响应 url

Catch request in service worker and respond with different image url

我的 service worker 中有这个获取功能,当 pwa 离线时,我尝试用不同的图像响应。 catch 中的 fetch 函数抛出:Uncaught (in promise) TypeError: Failed to fetch.

self.addEventListener('fetch', (e) => {
  if (e.request.method === 'GET') {
    e.respondWith(
      caches.match(e.request).then((cachedResponse) => {
        return cachedResponse || fetch(e.request.url)
          .then((res) => {
            return res;
          }).catch(() => {
             //if it is a image then
            let url1 = e.request.url.replace(".jpg", "_mini.jpg");
            return fetch(url1);
            /* Or like this
            caches.match(url1).then((cResp) => {
            return cResp;
            })
           */
          })

      })
    )
  }
});

是否无法在您离线时捕获错误并使用 "mini" 替代图像进行响应,或者我做错了什么?

您将返回 cachedResponse(如果存在),这会阻止您的替换逻辑被访问。尝试删除 cachedResponse ||.

这也可以删除:

.then((res) => {
    return res;
})

此外,如果您处于离线状态,return fetch(url1); 将无法工作,因为来自 Service Worker 的 fetch 不会递归触发另一个 FetchEvent。所以你必须 return caches.match(url1) 相反,这意味着它之前已经被缓存了。