您可能正在使用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