2016-02-24 8 views
1
event.respondWith(caches.match(event.request).then(function (response) { 
     if (response) { 
      return response; 
     }   
     //return fetch(event.reuqest, { credentials: 'include' }); 

     //event.respondWith(fetch(event.request, { credentials: 'include' })); 
    })); 

Это общий код для обработки запроса через serviceworkers, если URL в кэше затем возвращают ответ кэша или извлекать его с сервера. Но мое сомнение касается двух прокомментированных строк, нам нужно использовать один из них для получения ответа.разница между кокетливой страницей и файлом в serviceworker

Мои сомнения, когда я использую event.respondWith(fetch(event.request, { credentials: 'include' для извлечения страницы, я получаю следующую ошибку

DOMException: Не удалось выполнить «respondWith» на «FetchEvent»: Выборки событие уже ответил на.

Но страница, наконец, оказываются, безусловно, браузер, наконец, выборка ответа, но когда я использую Сэм для извлечения изображения, я получаю ту же ошибку, и на вершине, что изображение не извлекается.

Если я использую второй вариант, который return fetch(event.reuqest, { credentials: 'include' });, то он отлично работает как для изображения, так и для страницы.

Я не могу понять, в чем причина этой ошибки, а также почему она ведет себя по-разному для файла и страницы.

Мое другое сомнение заключается в том, действительно ли мне нужен параметр полномочий здесь, я добавил его, потому что большинство реализаций, которые я видел в Интернете, использовали его, но я заметил, что объект запроса уже имеет свойство учетных данных с это, в настоящее время это не всегда

включают

когда-то

общего происхождения

тоже. Так может случиться, что я фактически переопределяю фактическое значение учетных данных, добавив его. Если это не так, то нет никакой разницы в его включении или нет. Это не имеет значения.

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

ответ

2

У вас уже есть звонок event.respondWith, вам не нужно называть его дважды.

Ваш первый звонок будет использовать обещание, возвращенное:

caches.match(event.request).then(function(response) { 
    if (response) { 
    return response; 
    } 

    return fetch(event.reuqest, { credentials: 'include' }); 
}) 

Это обещание решает:

  • response, если запрос находится в кэше;
  • обещание, возвращенное по вызову fetch, в противном случае.

Обещание, возвращенное fetch, решит ответ, который затем будет использоваться responseWith.

+0

Да, но почему он ведет себя по-разному для файлов страниц и изображений? – biswpo

+0

Да, я также думаю, что это правильный синтаксис, но почему он ведет себя по-разному для файлов страниц и изображений в случае, когда я использую event.respondWith? И также я правильно отношусь к параметру учетных данных? будет ли он перезаписывать существующее значение учетных данных event.request? – biswpo

+1

Для первого вопроса, я не знаю, почему он ведет себя по-разному для изображений и страниц. Во втором вопросе да, он перезапишет существующее значение учетных данных (согласно https://fetch.spec.whatwg.org/#dom-request, новый созданный запрос принимает «учетные данные» из объекта запроса [шаг 7 ] и перезаписывается позже [шаг 18-19]). – Marco