Javascript 谁的回答;正文“;无法使用“已锁定”来响应请求

Javascript 谁的回答;正文“;无法使用“已锁定”来响应请求,javascript,google-chrome,service-worker,Javascript,Google Chrome,Service Worker,我只是在google chrome中尝试服务人员。我偶然发现一个错误。在这一刻,这似乎是在未来 我不相信错误是错误。当我在firefox中尝试时,会出现内容错误屏幕。在处理项目根目录的获取事件时发生: self.addEventListener('fetch', function(event) { // Nice url var requestURL = new URL(event.request.url); console.log("Request for: ", requestU

我只是在google chrome中尝试服务人员。我偶然发现一个错误。在这一刻,这似乎是在未来

我不相信错误是错误。当我在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');
      })
  );
});

我不确定body locked错误是什么意思,所以我甚至不知道什么代码是相关的。

问题是响应的
body
(实际内容,如HTML或JavaScript)只能用于特定目的一次,例如保存到缓存中或用作实际响应

为了解决这个问题,存在一种方法

事实上,
clone()
存在的主要原因是允许对对象进行多次使用(当对象仅为一次使用时)

在本例中,问题是将响应存储在缓存中,然后返回它。正确的做法是:

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