我们有从我们的媒体服务器重定向到CDN的图像,我试图从我的服务工作者逻辑中排除以解决Chrome 40中的错误。在Canary中,同一个工作人员能够正常工作。我认为有一个event.default()
可以回归到标准行为,但我在Chrome的实施中并没有看到这一点,并且阅读规范似乎目前的建议就是使用{{ 1}}。
所以我遇到的问题是,我必须要等到99%的所有用户都转移到Chrome 41+以便在这种情况下使用服务工作者,或者是否有某种方式我可以选择退出请求?
我的逻辑核心如下:
fetch(event.request)
答案 0 :(得分:4)
进入event.respondWith()
后,您需要发出回复,否则会产生网络错误。您是正确的,event.default()
目前尚未实施。
一般解决方案是,如果您可以同步确定您不想处理该事件,则不要输入event.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
处理程序是无操作符,并且任何其他已注册的fetch
处理程序都会获取请求。多个fetch
处理程序按照通过addEventListener
添加的顺序进行调用,一次一个,直到第一个调用event.respondWith()
。
如果没有提取处理程序调用{{1}},那么用户代理就会像没有服务工作者参与那样正常地发出请求。
要考虑的一个棘手的问题是,是否需要在每个event.respondWith()
处理程序内同步完成是否调用event.respondWith()
的确定。任何依赖于异步承诺解析的东西都不能用于确定是否要调用fetch
。如果您尝试异步操作然后调用event.respondWith()
,则最终会出现竞争条件,并且可能会在服务工作者控制台中看到有关如何无法响应已处理的事件的错误