无法在browserAction.setBadgeText期间检查runtime.lastError

时间:2015-08-21 01:43:18

标签: javascript google-chrome google-chrome-extension

chrome.browserAction.setBadgeText(object details)用于设置Chrome扩展程序的徽章文字。但是,如果tabId不存在,Chrome会使用console.error()产生以下错误:

  

运行browserAction.setBadgeText时未经检查的runtime.lastError:没有带id的标签:####。

在页面加载期间设置徽章文本时,这会成为问题。如果该标签最初存在但被用户关闭,则setBadgeText最终会使用不存在的tabId进行调用。

通常,可以通过检查有问题的函数as was answered in another question的回调参数中的chrome.runtime.lastError来防止这种情况。但是,由于browserAction.setBadgeText()没有回调参数,因此似乎无法阻止错误。

tabId是不表示任何选项卡的整数时,以下代码仍会产生错误,即使它尝试...

  • 使用try...catch 捕获错误(由于未引发console.error(),因此无法正常工作)
  • 在致电lastError 后检查setBadgeText(由于该功能是异步的,因此无法正常工作)
  • 在调用setTimeout 之后使用各种lastError时间间隔检查setBadgeText(这不起作用且可能不可靠)
  • setBadgeText 添加一个回调参数(由于没有第二个参数,因为chrome在使用时会产生另一个错误,因此已被注释掉)
var tabId = 5000;
function clearError () {
    console.log(chrome.runtime.lastError);
}
try {
    chrome.browserAction.setBadgeText({
        text: 'text',
        tabId: tabId
    }/*, clearError*/);
    clearError();
    setTimeout(clearError, 0);
    setTimeout(clearError, 50);
    setTimeout(clearError, 500);
}
catch (e) {
    console.log('Caught', e);
    clearError();
}

有没有办法正确检查chrome.runtime.lastError以防止发生此错误?

3 个答案:

答案 0 :(得分:6)

一个选项是首先调用chrome.tabs.get,如果没有调用错误,则假设该选项卡将在接下来的几毫秒内存在。

var tabId = 5000;
function callback(tab) {
    if (chrome.runtime.lastError) {
        console.log(chrome.runtime.lastError.message);
    } else {
        chrome.browserAction.setBadgeText({
            text: 'text',
            tabId: tabId
        });
    }
}
chrome.tabs.get(tabId, callback);

当然,在tabs.get整理和setBadgeText被调用之间,标签总是有可能被关闭,但这种可能性很小。

答案 1 :(得分:1)

除了如上所述的chrome.tabs.get()之外,您还可以搭载现有的browserAction方法,该方法接受回调以捕获错误。例如:

var tabId = 5000;
chrome.browserAction.getTitle({tabId: tabId}, function(result) {
  if (chrome.runtime.lastError) return;
  // The coast is clear...
  chrome.browserAction.setBadgeText({
    text: 'text',
    tabId: tabId
  });
});

好消息:chrome.browserAction.setBadgeText()还应支持chrome.browserAction.getTitle()之类的回调函数,根据one source从Chrome 67开始。手指交叉!

答案 2 :(得分:0)

此问题已报告错误,并已标记为已修复:https://crbug.com/451320