ServiceWorker 获取完成事件
ServiceWorker fetch-complete event
原因,我正在使用 serviceWorker - 是检查 cookie 结束前的时间。根据要求将 Cookie 有效期设置为 60 分钟。
我在 serviceWorker 上构建了 2 个版本的 fetch 监听器
此版本在客户端上重置时间计数器(通过 channel.postMessage
向其发送消息。但它会根据请求发送触发器(而不是在响应后)。
self.addEventListener( "fetch", event => {
channel.postMessage(true);
});
第二个版本创建新的 fetch 调用,获取响应,触发客户端,然后 returns 响应。
self.addEventListener( "fetch", event => {
event.respondWith((async () => {
const response = await fetch(event.request);
channel.postMessage(true);
return response;
})());
});
在这种情况下 - 第二种选择在时间上会更准确。但是如果查看开发人员工具中的网络选项卡,这会创建那些重复的网络请求
是否有可能让 fetch 做它的事情,让它完成,并在不创建新的 fetch 调用的情况下获得响应?我对用于缓存的任何类型的 serviceWorker 都不感兴趣(示例中 100% 的获取事件用例用于缓存...)
虽然 Chrome 的 DevTools 网络面板可能有点令人困惑,并且暗示并非如此,但在这种情况下只会进行一次网络调用。 更详细地解释了您所看到的内容。
如果您在 fetch
处理程序中只想调用 channel.postMessage()
,那么我建议您不要调用 event.respondWith()
。如果您在第一个处理程序之后注册了另一个 fetch
处理程序,则该处理程序将有自己的响应机会。如果 fetch
处理程序中的 none 调用 event.respondWith()
,那么从网络角度来看,这实际上是一个空操作。
self.addEventListener('fetch', (event) => {
// Optional: you might want to check for some criteria
// before calling channel.postMessage().
if (event.request.url === '...') {
channel.postMessage(true);
}
});
原因,我正在使用 serviceWorker - 是检查 cookie 结束前的时间。根据要求将 Cookie 有效期设置为 60 分钟。
我在 serviceWorker 上构建了 2 个版本的 fetch 监听器
此版本在客户端上重置时间计数器(通过 channel.postMessage
向其发送消息。但它会根据请求发送触发器(而不是在响应后)。
self.addEventListener( "fetch", event => {
channel.postMessage(true);
});
第二个版本创建新的 fetch 调用,获取响应,触发客户端,然后 returns 响应。
self.addEventListener( "fetch", event => {
event.respondWith((async () => {
const response = await fetch(event.request);
channel.postMessage(true);
return response;
})());
});
在这种情况下 - 第二种选择在时间上会更准确。但是如果查看开发人员工具中的网络选项卡,这会创建那些重复的网络请求
是否有可能让 fetch 做它的事情,让它完成,并在不创建新的 fetch 调用的情况下获得响应?我对用于缓存的任何类型的 serviceWorker 都不感兴趣(示例中 100% 的获取事件用例用于缓存...)
虽然 Chrome 的 DevTools 网络面板可能有点令人困惑,并且暗示并非如此,但在这种情况下只会进行一次网络调用。
如果您在 fetch
处理程序中只想调用 channel.postMessage()
,那么我建议您不要调用 event.respondWith()
。如果您在第一个处理程序之后注册了另一个 fetch
处理程序,则该处理程序将有自己的响应机会。如果 fetch
处理程序中的 none 调用 event.respondWith()
,那么从网络角度来看,这实际上是一个空操作。
self.addEventListener('fetch', (event) => {
// Optional: you might want to check for some criteria
// before calling channel.postMessage().
if (event.request.url === '...') {
channel.postMessage(true);
}
});