Подтвердить что ты не робот

Ошибка расширения Chrome: "Непроверено runtime.lastError при запуске browserAction.setIcon: нет вкладки с идентификатором"

Я кодирую расширение 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 не предлагает никаких методов синхронизации потоков...

Я наблюдал это поведение несколько раз, выполняя свои тесты. Это происходит не часто, потому что мы говорим о очень точной временной ситуации, но это происходит. Поэтому, если кто-нибудь найдет решение, отправьте его ниже.

4b9b3361

Ответ 1

Включите обратный вызов и проверьте chrome.runtime.lastError.

objIcon = {
    "19": "images/icon19.png",
    "38": "images/icon38.png"
};

function callback() {
    if (chrome.runtime.lastError) {
        console.log(chrome.runtime.lastError.message);
    } else {
        // Tab exists
    }
}

chrome.browserAction.setIcon({
    path: objIcon,
    tabId: nTabID

}, callback);