Fetch возвращает 200 в сервисный работник, даже если в автономном режиме - PullRequest
0 голосов
/ 30 октября 2019

Я хочу, чтобы мое приложение Angularjs (1.x) использовало автономную версию в качестве запасного варианта в случае отсутствия сети или отсутствия интернет-службы.

Я хочу, чтобы прослушиватель события получения работника службы пытался получитьглавную страницу из сети (когда request.mode == 'navigate') и верните кэшированную версию, если она потерпит неудачу.

По какой-то причине, хотя я отключил Wi-Fi или запустил "самолет"mode " fetch всегда возвращает StatusCode 200 OK . Но это действительно работает, если я включаю Chrome DevTools в режиме «Сеть> офлайн»

... Что я пробовал:

Я пытался определить офлайн-режим с помощью «навигатора». onLine », но не является надежным.

Также пытался очистить кеш, но ничего ... по-прежнему возвращает исходный "онлайн" HTML-документ ..

Также пытался передать "контроль кеша: no-store, no-cache""заголовок для выборки, с тем же результатом ..

self.addEventListener('fetch', function (event) {
  if (event.request.mode === 'navigate') {    
    event.respondWith(homeNetworkThenCache(event.request));
  } 
});

function homeNetworkThenCache(request){
  return fetch(request)
          .then(e => e)
          .catch(() => caches.match(offlineHomepageUrl));
}

Ожидаемое поведение:

Если нет подключения к Интернету, я ожидаю, что выборка войдет в блок" catch ", но это всегдавводит ".then (e => e)" ...

.. есть идеи, пожалуйста?

1 Ответ

0 голосов
/ 05 ноября 2019

Если вы ищете пример работника службы, который просто реализует автономную резервную страницу, вы можете использовать эту , которая также будет выполнять такие вещи, как включение предварительной загрузки навигации (еслиподдерживается):

const OFFLINE_VERSION = 1;
const CACHE_NAME = 'offline';
// Customize this with a different URL if needed.
const OFFLINE_URL = 'offline.html';

self.addEventListener('install', (event) => {
  event.waitUntil((async () => {
    const cache = await caches.open(CACHE_NAME);
    // Setting {cache: 'reload'} in the new request will ensure that the response
    // isn't fulfilled from the HTTP cache; i.e., it will be from the network.
    await cache.add(new Request(OFFLINE_URL, {cache: 'reload'}));
  })());
});

self.addEventListener('activate', (event) => {
  event.waitUntil((async () => {
    // Enable navigation preload if it's supported.
    // See https://developers.google.com/web/updates/2017/02/navigation-preload
    if ('navigationPreload' in self.registration) {
      await self.registration.navigationPreload.enable();
    }
  })());

  // Tell the active service worker to take control of the page immediately.
  self.clients.claim();
});

self.addEventListener('fetch', (event) => {
  // We only want to call event.respondWith() if this is a navigation request
  // for an HTML page.
  if (event.request.mode === 'navigate') {
    event.respondWith((async () => {
      try {
        // First, try to use the navigation preload response if it's supported.
        const preloadResponse = await event.preloadResponse;
        if (preloadResponse) {
          return preloadResponse;
        }

        const networkResponse = await fetch(event.request);
        return networkResponse;
      } catch (error) {
        // catch is only triggered if an exception is thrown, which is likely
        // due to a network error.
        // If fetch() returns a valid HTTP response with a response code in
        // the 4xx or 5xx range, the catch() will NOT be called.
        console.log('Fetch failed; returning offline page instead.', error);

        const cache = await caches.open(CACHE_NAME);
        const cachedResponse = await cache.match(OFFLINE_URL);
        return cachedResponse;
      }
    })());
  }

  // If our if() condition is false, then this fetch handler won't intercept the
  // request. If there are any other fetch handlers registered, they will get a
  // chance to call event.respondWith(). If no fetch handlers call
  // event.respondWith(), the request will be handled by the browser as if there
  // were no service worker involvement.
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...