Задать вопрос
@Asker1888

Как продолжить запрос на сервер, если в cashStorage отсутствует запрашиваемое?

Добрый день!
Разбираюсь с service workers, возник следующий вопрос:
Если я правильно понял принцип работы, то sw перехватывает каждый запрос к серверу и проверяет наличие запроса в кэше. В случае отсутствия он должен по идее вернуть управление оригинальному запросу, чтобы тот выполнился, но в моем случае это не происходит. Запрос просто возвращает ошибку (TypeError: Failed to fetch из actions.js).
Не понимаю, каким образом нужно указать, что при отсутствии кэша, нужно выполнить реальный запрос к серверу?

Руководствуюсь этой статьей.

Приложение Create React App. Запросы на сервер обрабатываются через fetch в redux-thunk.

Код sw:
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE).then((cache) =>
      cache.addAll(cacheData))
  );
});

self.addEventListener('fetch', (event) => {
  event.respondWith(fromCache(event.request));
  event.waitUntil(
    update(event.request)
      .then(refresh)
      .catch((error) => console.error('Failed from fetch: ', error))
  );
});

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

function update(request) {
  return caches.open(CACHE).then((cache) =>
    fetch(request).then((response) =>
      cache.put(request, response.clone()).then(() => response).catch((error) => console.error('Error from update: ', error))
    )
  );
}

function refresh(response) {
  console.log('RESPONSE', response);
  return self.clients.matchAll().then((clients) => {
    clients.forEach((client) => {
      const message = {
        type: 'refresh',
        url: response.url,
        eTag: response.headers.get('ETag')
      };
      client.postMessage(JSON.stringify(message));
    });
  }).catch((error) => console.error('Error from refresh: ', error));
}
  • Вопрос задан
  • 35 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы