Nano Hash - криптовалюты, майнинг, программирование

Повторный доступ к сервисному воркеру

Я использую сервис-воркер для кеширования запросов, сделанных из оставшейся службы. Реализация соответствует «сетевому ответу», описанному на этой странице https://web.dev/offline-cookbook/.

self.addEventListener('fetch', function (event) {
  event.respondWith(
    caches.open('mysite-dynamic').then(function (cache) {
      return cache.match(event.request).then(function (response) {
        return (
          response ||
          fetch(event.request).then(function (response) {
            cache.put(event.request, response.clone());
            return response;
          })
        );
      });
    }),
  );
});

Идея в том, что:

1. caller makes 1st request A
2. service worker intercepts the request A
3. service worker checks whether a request A is in storage -> no
4. service worker sends the request A to the rest service
5. service worker gets the response A
6. service worker stores the response A
7. service worker returns the response A to the caller
...
    8. caller makes 2nd request A
    9. service worker intercepts the request A
    10. service worker checks whether a request A is in the cache -> yes
    11. service worker gets the response A from storage
    12. service worker returns the response A to the caller

Проблема в том, что для возврата ответа на запрос rest требуется некоторое время, и может произойти следующий сценарий, когда 2 или более запросов выполняются к службе rest:

1. caller makes 1st request A
2. service worker intercepts the request A
3. service worker checks whether a request A is in storage -> no
4. service worker sends the request A to the rest service
    5. caller makes 2nd request A
    6. service worker intercepts the request A
    7. service worker checks whether a request A is in storage -> no
8. service worker gets the response A
9. service worker stores the response A
10. service worker returns the response A to the caller
    11. service worker gets the response A
    12. service worker stores the response A
    13. service worker returns the response A to the caller

Как получить только 1 запрос?


  • Кэшируйте их. Я имею в виду, кэшировать само обещание (или: запомните функцию, которая обслуживает запрос), вам просто нужно сделать это < i> до выполнения fetch. И вы не можете поместить обещание во встроенную cache, и вам нужно будет выбрать идентификатор ресурса (URL?), Которым будет управляться ваш кеш. 12.02.2021
  • Спасибо за ответ. Момоизация обещания ответа работает нормально. На данный момент я реализовал это на стороне вызывающего абонента, поскольку я не уверен, как это сделать в сервис-воркере. 15.02.2021

Ответы:


1

Если вы готовы использовать библиотеки Workbox вместо стандартного кода сервис-воркера, этот рецепт может помочь:

// See https://developers.google.com/web/tools/workbox/guides/using-bundlers
import {NetworkFirst} from 'workbox-strategies';

class DedupeNetworkFirst extends NetworkFirst {
  constructor(options) {
    super(options);
    // This maps inflight requests to response promises.
    this._requests = new Map();
  }

  // _handle is the standard entry point for our logic.
  async _handle(request, handler) {
    let responsePromise = this._requests.get(request.url);

    if (responsePromise) {
      // If there's already an inflight request, return a copy
      // of the eventual response.
      const response = await responsePromise;
      return response.clone();
    } else {
      // If there isn't already an inflight request, then use
      // the _handle() method of NetworkFirst to kick one off.
      responsePromise = super._handle(request, handler);
      this._requests.set(request.url, responsePromise);
      try {
        const response = await responsePromise;
        return response.clone();
      } finally {
        // Make sure to clean up after a batch of inflight
        // requests are fulfilled!
        this._requests.delete(request.url);
      }
    }
  }
}

Затем вы можете использовать класс DedupeNetworkFirst вместе с маршрутизатором Workbox, или, как вариант, используйте его непосредственно в вашем собственном fetch обработчике, если вы не хотите использовать больше Workbox.

16.02.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..