в API Cache, в чем разница между использованием caches.match (event.request) и caches.match (event.request.url) - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю с работником службы, и у меня есть следующий код

  self.addEventListener('fetch', function (event) {
    const url = new URL(event.request.url)

    if (event.request.mode == "navigate") {
        const fetchData = fetch(event.request).catch(function () {
            //console.log("errr")
            return caches.match("/core/index.php/offline_controlador/index")
        });
        event.respondWith(fetchData)
        return;
    }

    event.respondWith(
        caches.match(event.request).then(function (response) {
            return response || fetch(event.request);
        })
    );
 });

, когда я пытался получить эти файлы из кэша, он не работает, но когда я изменяю код на

event.respondWith(
        caches.match(event.request.url).then(function(response) {
          return response || fetch(event.request);
        })
    );

вместо

event.respondWith(
            caches.match(event.request).then(function(response) {
              return response || fetch(event.request);
            })
        );

Отлично работает

1 Ответ

0 голосов
/ 13 сентября 2018

Соответствующим разделом спецификации Cache Storage API является 5.4.2 . (Хотя это относится к методу matchAll() объекта Cache, это то, что в конечном итоге называется "под капотом", когда вы делаете caches.match().

Особое отношение к вашему вопросу имеет шаг 2:

Если запрос необязательного аргумента не опущен, то:

  • Если request является Request объектом, то:

    • Установите r на запрос request.

    • Если метод r не GET и options.ignoreMethod ложно, вернуть Обещание разрешено с пустым массивом.

  • Иначе, если запрос является строкой, то:

    • Установить r на соответствующий запрос результата вызова начальной значение Request в качестве конструктора с request в качестве аргумента. Если это выдает исключение, возвращает обещание, отклоненное с этим исключением.

Подводя итог, можно сказать, что самое большое отличие состоит в том, что передача объекта Request в качестве первого параметра может привести к сбою match(), если Request имеет method чего-то отличного от 'GET'. Может быть, это то, что вы сталкиваетесь.

Кроме этого, два подхода должны быть в основном одинаковыми, хотя передача Request немного более эффективна, поскольку браузеру не нужно неявно создавать Request объект на основе строки.

...