Я кодирую расширение Google Chrome, где я установил значок приложения из фона script следующим образом:
try
{
objIcon = {
"19": "images/icon19.png",
"38": "images/icon38.png"
};
chrome.browserAction.setIcon({
path: objIcon,
tabId: nTabID
});
}
catch(e)
{
}
Обратите внимание, что я завернул вызов в блок try/catch.
Тем не менее, иногда я получаю следующее сообщение в журнале консоли:
Отключено runtime.lastError при запуске browserAction.setIcon: Нет tab с идентификатором: 11618.
Трудно отладить эту ошибку, потому что она появляется только тогда, когда я закрываю или перезагружаю вкладку Chrome, у нее нет номера строки или какой-либо информации для меня, чтобы отслеживать, а также нелегко запускать через отладчик (т.е. я не могу установить точку останова в момент возникновения ошибки, но если я слепо установите точку прерывания в строке chrome.browserAction.setIcon()
, я больше не вижу сообщение в журнале.)
Так что мне любопытно, может ли кто-нибудь предложить, как исправить эту ошибку?
EDIT. Просто опубликуйте обновление. Я все еще не могу решить эту проблему. Предложение, предложенное ниже в @abraham, предлагает несколько рабочий подход, но не отказоустойчив. Например, в ситуации, когда закрывается вкладка, я могу назвать его предложенную chrome.browserAction.setIcon()
, которая может быть успешной, если вкладка еще не закрыта, но в то время как внутри ее функции обратного вызова вкладка может в конечном итоге закрыть и, следовательно, любые последовательные вызовы в какой-либо другой API для которого требуется тот же самый идентификатор вкладки, скажем, setBadgeBackgroundColor()
, может все же дать мне такое же исключение No tab with id
. Другими словами, для тех, кто знает собственное программирование, это классическая ситуация с условиями гонки. И я не уверен, что это ошибка в Chrome, потому что, очевидно, JS не предлагает никаких методов синхронизации потоков...
Я наблюдал это поведение несколько раз, выполняя свои тесты. Это происходит не часто, потому что мы говорим о очень точной временной ситуации, но это происходит. Поэтому, если кто-нибудь найдет решение, отправьте его ниже.