chrome扩展读取值问题

时间:2011-08-05 14:59:06

标签: google-chrome-extension

我正在构建我的chrome扩展,我有一个奇怪的问题。这是我在后台页面中运行的脚本:

function getOpenedTabs() {
  var openedTabs = [];
  chrome.windows.getAll({}, function(wins) {
    for (var w in wins) {
      if (wins[w].id !== undefined) {
        chrome.tabs.getAllInWindow(wins[w].id, function(tabs) {
          for (var t in tabs) {
            if (tabs[t].id !== undefined) {
              openedTabs.push(tabs[t]);
            }
          }
        });
      }
    }
  });
  return openedTabs;
}

chrome.tabs.onCreated.addListener(function(tab){
  var openedTabs = getOpenedTabs();
  var length = openedTabs.length;
  console.log("Quantity of tabs: " + length );
  if (length  > 20) {
    openedTabs.sort(function(a,b){return a.visitCount - b.visitCount});
    var t = openedTabs.shift();
    chrome.tabs.remove(t.id);
    console.log("The extension closed the " + t.title + " tab");
  }
});

在调试模式下openedTabs.length返回正确的值。但是当我删除所有断点时,openedTabs.length始终返回零。

它可能是一个什么样的问题? 感谢。

1 个答案:

答案 0 :(得分:2)

Chrome API调用是异步的(想想ajax调用),因此它们不会按顺序执行。你不能return这种方法,你需要使用回调。

function getOpenedTabs(callback) {
  chrome.windows.getAll({populate: true}, function(wins) {
    var openedTabs = [];
    for (var w=0; w<wins.length;w++) {
      for (var t=0;t<wins[w].tabs.length;t++) {
        if (wins[w].tabs[t].id !== undefined) { //I don't think this check is needed
          openedTabs.push(wins[w].tabs[t]);
        }
      }
    }
    if(callback) {
        callback(openedTabs);
    }
  });
}

chrome.tabs.onCreated.addListener(function(tab){
  getOpenedTabs(function(openedTabs) {
      var length = openedTabs.length;
      console.log("Quantity of tabs: " + length );
      if (length  > 20) {
        openedTabs.sort(function(a,b){return a.visitCount - b.visitCount});
        var t = openedTabs.shift();
        chrome.tabs.remove(t.id);
        console.log("The extension closed the " + t.title + " tab");
      }
  });
});

您无需使用getAllInWindow(),您可以使用getAll()获取所有标签。使用in迭代数组也不是一个好习惯。