Проблема чтения значения расширения Chrome - PullRequest
2 голосов
/ 05 августа 2011

Я строю свое расширение 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 Ответ

2 голосов
/ 05 августа 2011

Вызовы API Chrome являются асинхронными (например, вызовы 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 для итерации по массиву не является хорошей практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...