如果我不想对原始请求做任何事情,我应该 return 在 JS Service Worker onFetch 回调函数中承诺吗?

Should I return a promise in a JS Service Worker onFetch callback function if I don't want to do anything with the original request?

我的场景如下:

  1. 我有一个 Progressive Web App,它使用 Service Worker,我需要在其中 catch 请求并使用每次用户请求资源或离开当前URL
  2. 我正在通过向 worker
  3. fetch event 添加回调来处理该问题
  4. 我只关心我们域内请求的资源(例如example.com)
  5. 如果请求的资源在我们的域内,我 return 承诺结果来自常规 fetch,所以这已经涵盖了
  6. 但是,如果请求的资源在我的域之外(如下面的代码片段所示)我希望原始请求继续
  7. 我目前只是在做一个简单的return如果项目符号 5 中的场景是真的

我当前代码的片段:

function onFetch(event) {
  if (!event.request.url.startsWith("example.com")) {
    return;
  } else {
    event.respondWith(
      fetch(event.request)
        .then(req => {
          // doing something with the request
        })
        .catch((error)=> {
          // handle errors etc.
        })
        .finally(()=> {
          // cleanup
        })
    );
  }
}

self.addEventListener('fetch', onFetch);

我的问题:如果我只是 return 与代码段中的内容完全不同,或者我是否需要 return 一些特定的东西,比如通过获取原始请求的新承诺 (就像我在 else 块上做的那样)?

谢谢!

做你正在做的事绝对没问题。 Not 调用 event.respondWith() 是向浏览器发出的信号,表明给定的 fetch 处理程序不会生成对给定请求的响应,您可以构建代码提前到 return 以避免致电 event.respondWith().

您可能注册了多个 fetch 处理程序,如果第一个 returns 没有调用 event.respondWith(),则下一个 fetch 处理程序将有机会响应.如果所有 fetch 个处理程序都已执行并且其中 none 个调用 event.respondWith(),浏览器将自动处理请求,就好像根本没有服务工作者一样,这就是您想要的。

就观察到的行为而言,根本不调用 event.respondWith() 最终看起来与调用 event.respondWith(event.request) 时发生的情况类似。但是在 service worker 内部发出 fetch() 请求然后将响应主体从 service worker 线程传递回主程序会产生开销,如果不调用 [=10 就可以避免这种开销=].因此,我推荐您采用的方法。