javascript - Chrome 扩展程序错误 : "Unchecked runtime.lastError while running browserAction.setIcon: No tab with id"

标签 javascript google-chrome google-chrome-extension race-condition

我正在编写我的 Google Chrome 扩展程序,其中我从后台脚本设置应用程序的图标,如下所示:

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

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

    });
}
catch(e)
{
}

请注意,我将调用包装在 try/catch block 中。

不过,有时我会在控制台日志中收到以下消息:

Unchecked runtime.lastError while running browserAction.setIcon: No tab with id: 11618.

很难调试这个错误,因为它似乎只在我关闭或重新加载 Chrome 选项卡时才会出现,它没有行号或任何可供我跟踪的信息,而且通过调试器运行并不容易(即,我无法在发生错误时设置断点,但是如果我盲目地在 chrome.browserAction.setIcon() 行上设置断点,我看不到该消息不再在日志中。)

所以我很好奇是否有人可以建议如何纠正这个错误?

编辑:只是发布更新。我仍然无法解决这个问题。下面@abraham 提出的建议提供了一种有点工作的方法,但它不是万无一失。例如,在选项卡关闭的情况下,我可能会调用他建议的 chrome.browserAction.setIcon() 如果选项卡尚未关闭,则可能会成功,但在其回调函数内,选项卡可能会成功最终关闭,因此对需要相同选项卡 ID 的其他 API 的任何连续调用(例如 setBadgeBackgroundColor())可能仍然会给我相同的 No tab with id 异常。换句话说,对于那些了解本地编程的人来说,这是一种典型的竞争条件情况。而且我不确定这是否是 Chrome 中的一个 bug,因为显然 JS 没有提供任何线程同步方法...

我在进行测试时多次目睹过这种行为。这种情况并不经常发生,因为我们谈论的是非常精确的计时情况,但它确实发生了。因此,如果有人找到解决方案,请在下面发布。

最佳答案

包含回调并检查 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);

关于javascript - Chrome 扩展程序错误 : "Unchecked runtime.lastError while running browserAction.setIcon: No tab with id",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25735050/

相关文章:

javascript - << 运算符对大于 32 的移位有什么作用?

google-chrome - Chrome 不尊重主机文件条目

JavaScript 变量不起作用

javascript - 错误无法设置未定义的属性 'value'

javascript - 使用不完成底层主题的多播实现流

javascript - 单击即可更新数据输入

javascript - 如何在 Chrome desktopCapture 中获取调整大小事件

browser - 如何指定网页的语言,以便 Google Chrome 不提供翻译功能

javascript - 在 Chrome 扩展程序中运行 Javascript -> 基本?

javascript - 显示 "loading..."图像的好方法是什么?