自chrome.storage添加以来,代码似乎没有执行

时间:2013-02-27 21:00:37

标签: debugging google-chrome google-chrome-extension local-storage google-chrome-devtools

在调试器中查找扩展时,我的chrome.tabs.query代码似乎无法执行。我正在尝试使用chrome.storage API来记录访问nytimes.com上文章的次数,因为我在开头添加了chrome.storage代码,调试器似乎没有输入chrome.tabs.query功能

var nytCount = chrome.storage.local.get["nyt"];

// if nytCount doesn't exist in chrome local storage, set to 0
if (nytCount === undefined)
{
    nytCount = 0;
}


/*
* Below is adapted from user Rob W at Stack Overflow (http://stackoverflow.com/questions/10413911/how-to-get-the-currently-opened-tabs-url-in-my-page-action-popup/10417327#10417327)
*
// Gets URL from currently active window (this should all be onload I suspect)*/
chrome.tabs.query({
    // Select active tabs
    active: true,
    // In the current window                              
    windowId: chrome.windows.WINDOW_ID_CURRENT 
}, function(array_of_Tabs) {
    // Since there can only be one active tab in one active window, the array has only one element
    var tab = array_of_Tabs[0];
    var title = tab.title;

    if (title.indexOf("NYTimes.com") !== -1)
    {
        nytCount++;
    }

    // rest of if conditions for those sites that have identifiers in tab titles
});

alert(nytCount);

有什么想法吗?它在我将nytCount初始化为0之前工作正常,但当然它的值只能在下一个代码的重新初始化之前重新初始化为1。

2 个答案:

答案 0 :(得分:1)

我看到的主要问题是chrome.storage.local.get调用是异步的并且具有必需的回调。尝试将其更改为以下内容:

var nytCount = 0;
chrome.storage.local.get("nyt", function(items) {
    doStuff(items.nyt);
   // items.nyt is the value you want out of this
});

function doStuff(nyt){
  nytCount = nyt;
  if(nytCount == undefined)
    nytCount = 0;
  //put the rest of your code in here
  //so that it all runs after you get the number out of storage
}

不要忘记通过chrome.storage.local.set电话更新存储空间中的值。对于那个,回调是可选的。

答案 1 :(得分:1)

只有在您想立即查询选项卡的状态时才应使用

chrome.tabs.query

要监控您访问网站的频率,请使用chrome.tabs events之一,例如chrome.tabs.onUpdated。为避免重复计算,您应检查changeInfo.status属性是否“完整”。

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    var url = changeInfo.url; // String or undefined
    if (changeInfo.status == 'complete' && url && url.indexOf("nytimes.com") !== -1) {
        // TODO: increase counter by one
    }
});

您的下一个问题是chrome.storage的使用方式。它是一个异步API,因此您无法使用getter来读取实际值。此外,读取后,这些值不会神奇地保存回存储器中。

对于存储计数器,我建议localStorage超过chrome.storage。它是一个同步API,非常适合存储少量数据(如计数器)。只能存储字符串,因此请确保在阅读后将值转换为数字:

var nytCount = +localStorage.getItem('nyt') || 0;

// Whenever you want to increase the counter:
localStorage.setItem('nyt', ++nytCount);

这假设只有一个页面与nyt变量交互。当多个页面(例如选项+背景页面)使用(读/写)变量时,您不能依赖局部变量,并且必须在写入之前读取最新值:

localStorage.setItem('nyt', (+localStorage.getItem('nyt') || 0) + 1);

如果你想采用异步路由(chrome.storage),你可以在加载时读取值(并推迟/排队chrome.tabs.onUpdated个事件),或者总是在更新时读取+写入计数器:

chrome.storage.local.get('nyt', function(items) {
    var nyt = items.nyt || 0;
    chrome.storage.local.set({
        nyt: nyt + 1
    }, function() {
        // Only here, you can be certain that the value has been saved
        // Usually less than one millisecond
    });
});