您可能正在使用Event pages使用的空闲卸载(因为您说检查工作 - 这会唤醒它)。
这是你的选择投入"persistent": false
和它comes with consequences。
如果您依赖任何状态变量,它们将在页面卸载时丢失。如果您必须保持任何状态,请在chrome.storage.local
中执行。
另一个常见错误是每次脚本运行时都不会重新注册全部事件侦听器。卸载但记忆听众的机制取决于它;如果事件被触发,将发生以下事件:
- 检查它是否有任何听众注册了该事件。如果没有,什么都不要做。
- 如果存在,监听器本身不再存在(JS上下文被卸载)。执行页面重建上下文。
- 页面停止执行后(忽略异步代码,Chrome不会等待),请选择注册,该运行与事件匹配并执行它。
所以,如果你,说,注册的代码路径的监听器,这不是执行每次运行脚本时(例如未在顶级声明,但有条件或异步),然后醒来后的剧本获得了” t已经启用了该听众并且该事件将被丢弃:
/* 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 */
因此,将任何条件/异步处理放入侦听器中。
为什么它可以停止工作还有其他一些原因,但没有看到您的代码是不可能分辨的。
来源
2015-07-05 09:45:47
Xan
用链接中显示的方式包装整个脚本? – Nit
@Nit:但这只是一个'IF'声明 - 只会在某个时间点起作用。我可以使用try catch块并封装整个脚本,但这似乎很奇怪。这是一种标准做法吗? –
不完全是您的问题的答案,但大多数时间延长失败,因为您没有处理互联网连接问题。 – mallik1055