我正在开发一个Chrome扩展程序,其background script(或event script)会持续运行并检测是否在任何标签页中访问了某些网页,然后进行了一些处理。
我注意到脚本会不时地随机停止工作,但如果我重新启动浏览器或检查控制台的后台脚本,则会再次启动。
我知道如何在chrome.storage.local中存储数据,我希望每次抛出运行时错误时都能检测并创建一个条目,这可能吗?即一个脚本宽的捕获块?
我看到this post解释了如何处理运行时错误,但这仅适用于单个回调函数。我希望能够为整个脚本执行此操作。
答案 0 :(得分:1)
您可能正在使用Event pages使用的空闲卸载(因为您说检查工作 - 将其唤醒)。
您可以选择加入"persistent": false
和comes with consequences。
如果您依赖任何状态变量,则在卸载页面时它们将丢失。如果您必须保留任何状态,请在chrome.storage.local
中进行。
另一个常见错误是每次脚本运行时都不会重新注册所有事件侦听器。 unload-but-remember-listeners机制依赖于它;如果触发事件,则会发生以下情况:
因此,如果您在代码路径中注册了一个侦听器,该代码路径在每次运行脚本时都没有执行(例如,不是在顶级语句中而是有条件地或异步地执行),那么在唤醒脚本后赢得&启用该侦听器并删除该事件:
/* 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 */
所以在侦听器中放置任何条件/异步处理。
还有其他原因导致它停止工作,但如果没有看到您的代码,就无法判断。