我正在开发一个 Chrome 扩展程序,它的 background script (或 event script )它连续运行并检测是否在任何选项卡中访问了某些网页,然后进行一些处理。
我注意到该脚本时不时地随机停止工作,但如果我重新启动浏览器或检查控制台中的后台脚本,该脚本会再次启动。
我知道如何在 chrome.storage.local 中存储数据,并且我希望能够在每次抛出运行时错误时进行检测并进行输入,这可能吗?即脚本范围的 catch block ?
我看到了this post它解释了如何处理运行时错误,但这仅适用于单个回调函数。我希望能够对整个脚本执行此操作。
最佳答案
您可能正在执行空闲卸载 Event pages使用(因为你说检查工作 - 这会唤醒它)。
您可以选择输入"persistent": false
,然后comes with consequences .
如果您依赖任何状态变量,它们将在页面卸载时丢失。如果您必须保留任何状态,请在 chrome.storage.local
中进行。
另一个常见错误是每次脚本运行时没有重新注册所有事件监听器。 unload-but-remember-listeners 机制依赖于它;如果触发事件,则会发生以下情况:
- 检查是否有为该事件注册的监听器。如果没有,则什么也不做。
- 如果存在,则监听器本身不再存在(JS 上下文已卸载)。执行页面以重建上下文。
- 页面停止执行后(不管异步代码,Chrome 都不会等待),选择在此运行中注册的与事件匹配的监听器并执行它。
因此,如果您在代码路径中注册了一个监听器,该监听器并非每次运行脚本时都执行(例如,不是在顶级语句中,而是有条件或异步地),那么在唤醒脚本后,该监听器将不会执行启用监听器并且事件将被删除:
/* Chrome wakes up your page */
chrome.storage.local.get("option", function(data) {
if(data.option) {
// Asynchronous
chrome.someAPI.onSomeEvent.addListener(function() {
// This will not be handled after unload
});
}
});
// Synchronous
chrome.someAPI.onSomeEvent.addListener(function() {
// This will be handled after unload
chrome.storage.local.get("option", function(data) {
if(data.option) {
// Do stuff
});
}
});
/* At this point, Chrome triggers the event,
and if there are no listeners (re)registered it's lost */
因此,将任何条件/异步处理放入监听器中。
还有其他原因导致它停止工作,但如果不查看代码就无法判断。
关于javascript - Chrome 扩展 - 如何捕获所有运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226181/