2016-06-10 1 views
1

Я просто пытался служащих службы в google хром. Я наткнулся на ошибку. Googling the error gives one single result в данный момент, который, кажется, находится в google chrome sourcecode.Ответ, чье «тело» заблокировано, не может использоваться для ответа на запрос

Я не уверен, что ошибка является ошибкой. Когда я пытаюсь использовать firefox, я получаю Ошибка в поврежденном содержимом. Это происходит, когда я обработку выборки события для корня проекта:

self.addEventListener('fetch', function(event) { 
    // Nice url 
    var requestURL = new URL(event.request.url); 
    console.log("Request for: ", requestURL.href); 
    // Network, then cache, then fallback 
    event.respondWith(
    // Try to download 
    fetch(event.request) 
     .then(function(x) { 
     console.log(" "+requestURL.href+" >> ",x); 
     // If failed the x will not be ok 
     if(x && x.ok) { 
      // If result was ok save it to cache 
      cache.put(event.request, x); 
      return x; 
     } 
     else 
      // Try to fetch cached version if request failed 
      return cache.match(event.request); 
     }) 
     // In case of error return something like 404 page 
     .catch(function(error) { 
     console.warn(" "+requestURL.href+" >> UNAVAILABLE: ",error); 
     return cache.match('/page/content-not-available-offline'); 
     }) 
); 
}); 

Я не уверен, что тело заперто означает ошибку, так что я даже не знаю, какой код актуален.

ответ

5

Проблема заключается в том, что body ответа (фактическое содержимое, например, HTML или JavaScript) может использоваться только один раз для определенных целей, например, сохранение в кеш или использование в качестве фактического ответа.

Чтобы решить эту проблему, Response.prototype.clone() способ существует.

В самом деле, основная причина clone() существует, чтобы позволить многократное использование Body объектов (когда они только одноразовое использование.)

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

if(x && x.ok) { 
    // If result was ok save it to cache 
    cache.put(event.request, x.clone()); 
    return x; 
}