Google chrome 是否有针对服务人员的Chrome M40重定向错误的解决方法?
我们有从媒体服务器重定向到CDN的图像,我正试图将其从我的服务工作者逻辑中排除,以解决Chrome40中的缺陷。在金丝雀,同样的工人也能工作得很好。我原以为有一个Google chrome 是否有针对服务人员的Chrome M40重定向错误的解决方法?,google-chrome,service-worker,Google Chrome,Service Worker,我们有从媒体服务器重定向到CDN的图像,我正试图将其从我的服务工作者逻辑中排除,以解决Chrome40中的缺陷。在金丝雀,同样的工人也能工作得很好。我原以为有一个event.default()可以回到标准行为,但在Chrome的实现中我看不到这一点,阅读规范时,当前的建议似乎只是使用fetch(event.request) 所以我的问题是,我是否必须等到99%的用户迁移到Chrome 41+才能在这种情况下使用服务人员,或者是否有某种方式可以选择退出某些请求 我的逻辑核心如下: worker.a
event.default()
可以回到标准行为,但在Chrome的实现中我看不到这一点,阅读规范时,当前的建议似乎只是使用fetch(event.request)
所以我的问题是,我是否必须等到99%的用户迁移到Chrome 41+才能在这种情况下使用服务人员,或者是否有某种方式可以选择退出某些请求
我的逻辑核心如下:
worker.addEventListener('install', function(event){
event.waitUntil(getDefaultCache().then(function(cache){
return cache.addAll(precacheUrls);
}));
});
worker.addEventListener('fetch', function(event){
event.respondWith(getDefaultCache().then(function(cache){
return cache.match(event.request).then(function(response){
if (!response){
return fetch(event.request.clone()).then(function(response){
if (cacheablePatterns.some(function(pattern){
return pattern.test(event.request.url);
})) {
cache.put(event.request, response.clone());
}
return response;
});
}
return response;
});
}));
});
一旦进入
事件。respondWith()
中,您确实需要发出响应,否则将导致网络错误。您认为当前未实现event.default()
,这是正确的
如果可以同步确定不希望处理该事件,则一般解决方案是不输入事件。respondWith()
。一个基本的例子是:
function fetchHandler(event) {
if (event.request.url.indexOf('abc') >= 0) {
event.respondWith(abcResponseLogic);
} else if (event.request.url.indexOf('def') >= 0) {
event.respondWith(defResponseLogic);
}
}
self.addEventListener('fetch', fetchHandler);
如果未调用event.respondWith()
,则此fetch
处理程序是一个no-op,任何其他注册的fetch
处理程序都会在请求时获得快照。按照通过addEventListener
添加的顺序调用多个fetch
处理程序,每次调用一个,直到第一个处理程序调用event.respondWith()
。
如果没有提取处理程序调用event.respondWith()
,则用户代理会像没有服务人员参与时一样发出请求
需要考虑的一件棘手的事情是,关于是否调用
event.respondWith()
的确定需要在每个fetch
处理程序中同步完成。任何依赖异步承诺解析的内容都不能用于确定是否调用event.respondWith()
。如果您尝试执行一些异步操作,然后调用事件.respondWith()
,那么最终将出现竞态条件,并且可能会在服务工作者控制台中看到关于如何无法响应已处理事件的错误。一旦进入事件.respondWith()
您确实需要发出响应,否则将导致网络错误。您认为当前未实现event.default()
,这是正确的
如果可以同步确定不希望处理该事件,则一般解决方案是不输入事件。respondWith()
。一个基本的例子是:
function fetchHandler(event) {
if (event.request.url.indexOf('abc') >= 0) {
event.respondWith(abcResponseLogic);
} else if (event.request.url.indexOf('def') >= 0) {
event.respondWith(defResponseLogic);
}
}
self.addEventListener('fetch', fetchHandler);
如果未调用event.respondWith()
,则此fetch
处理程序是一个no-op,任何其他注册的fetch
处理程序都会在请求时获得快照。按照通过addEventListener
添加的顺序调用多个fetch
处理程序,每次调用一个,直到第一个处理程序调用event.respondWith()
。
如果没有提取处理程序调用event.respondWith()
,则用户代理会像没有服务人员参与时一样发出请求
需要考虑的一件棘手的事情是,关于是否调用
event.respondWith()
的确定需要在每个fetch
处理程序中同步完成。任何依赖异步承诺解析的内容都不能用于确定是否调用event.respondWith()
。如果您尝试执行异步操作,然后调用event.respondWith()
,您将最终遇到竞争条件,并且可能会在服务人员控制台中看到错误,说明您如何无法响应已处理的事件。您能给我指出错误的URL吗?谢谢你们能给我指一下bug的URL吗?谢谢有一个正在进行的工作样本在展示这种相互作用,有一个正在进行的工作样本在展示这种相互作用