我发现https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/onerror表示:
ServiceWorkerContainer接口的onerror属性是一个事件处理程序,只要在关联的服务工作程序中发生错误事件,就会触发该事件处理程序。
但是,我无法在Chrome(v51)中使它正常工作。在主应用程序的范围内,我从控制台运行了以下代码:
navigator.serviceWorker.onerror = function(e) { console.log('some identifiable string' + e); };
然后在活动服务人员的范围内,我触发了一个任意错误:
f(); // f is undefined
结果是通常的“ Uncaught ReferenceError:未定义(…)”错误消息,但未通过我的全局onerror处理程序记录。
MDN页面显示,自v40以来,Chrome已支持此API,但navigator.serviceWorker.onerror
最初未定义,这使我相信它尚未实现。有人熟悉吗?
也许您试图像这样onerror
在navigator.serviceWorker
容器上设置处理程序:
// no effect outside service worker script
navigator.serviceWorker.onerror = function() {...};
错误处理程序必须在服务工作程序脚本中使用self.onerror
(self
是一个特殊的变量/属性,在此引用ServiceWorkerGlobalScope
)进行设置。该onerror
回调只提供一条错误消息。
// inside service worker script
self.onerror = function(message) {
console.log(message);
};
或者,您可以侦听服务人员的error
事件,其中包括一个ErrorEvent
包含错误位置的事件:
// inside service worker script
self.addEventListener('error', function(e) {
console.log(e.filename, e.lineno, e.colno, e.message);
});
这是一个演示。确保从DevTools>资源>服务工作者(在左侧面板上)删除服务工作者,因为它将填充以下失败的服务工作者注册:
我已经验证了onerror
Service Worker实例中的以下浏览器支持:
更新:
因此,当MDN描述该
ServiceWorkerContainer
接口时,是指self
(ServiceWorkerGlobalScope
)而不是navigator.serviceWorker
?
我认为这仅适用于该onerror
属性(可能还适用于该属性中的其他事件),并且我猜想该规范尚未更新以反映商定的实现...
该服务人员工作组已经决定将onerror
在ServiceWorkerContainer
进入服务工人实例,如在GitHub的讨论(slightlyoff/ServiceWorker
#198):
kinu于2014年4月2日评论了
sgtm2。对于错误报告(
onerror
内容),我们可能可以做类似的事情?例如,将.onerror
处理程序从容器移动到SW对象,以便doc可以明确知道错误来自哪个SW(尽管可能需要将处理程序附加到多个SW)。
然后在一个相关的问题(slightlyoff/ServiceWorker
#104)中有一个后续评论,该评论表明onerror
该容器没有用处:
jakearchibald于2014年4月3日评论了
考虑用例(从#198开始)…
navigator.serviceWorker.onerror
或navigator.serviceWorker.pending.onerror
(无论它变为哪种)对于将错误记录回服务器都没有用,因为错误可能发生在任何页面的生命周期之外。onerror
在工作人员内部最适合这样做。
.pending.onerror
如果您要更新UI以响应更新,则很有用。因此statechange
,尽管您需要在某处放置错误消息,但最好还是将它作为。这样就可以在创建SW实例之前发生错误。AppCache的错误事件涵盖与网络相关的更新失败,也分析失败。但是,我们将再次失去在页面生命周期之外发生的所有错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句