如果我不想对原始请求做任何事情,我应该 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?
我的场景如下:
- 我有一个 Progressive Web App,它使用 Service Worker,我需要在其中 catch 请求并使用每次用户请求资源或离开当前URL
- 我正在通过向 worker
的 fetch event 添加回调来处理该问题
- 我只关心我们域内请求的资源(例如example.com)
- 如果请求的资源在我们的域内,我 return 承诺结果来自常规
fetch
,所以这已经涵盖了
- 但是,如果请求的资源在我的域之外(如下面的代码片段所示)我希望原始请求继续
- 我目前只是在做一个简单的
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 就可以避免这种开销=].因此,我推荐您采用的方法。
我的场景如下:
- 我有一个 Progressive Web App,它使用 Service Worker,我需要在其中 catch 请求并使用每次用户请求资源或离开当前URL
- 我正在通过向 worker 的 fetch event 添加回调来处理该问题
- 我只关心我们域内请求的资源(例如example.com)
- 如果请求的资源在我们的域内,我 return 承诺结果来自常规
fetch
,所以这已经涵盖了 - 但是,如果请求的资源在我的域之外(如下面的代码片段所示)我希望原始请求继续
- 我目前只是在做一个简单的
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 就可以避免这种开销=].因此,我推荐您采用的方法。