2011-08-05 23 views
2

クローム拡張機能をビルドしていて、奇妙な問題が発生しています。これは私が背景ページで実行しているスクリプトです:クロム拡張機能読み取り値の問題

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は常にゼロを返します。

どのような問題がありますか?おかげさまで

答えて

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"); 
     } 
    }); 
}); 

あなたはgetAll()ですべてのタブを取得することができ、getAllInWindow()を使用する必要はありません。また、inを使用して配列を反復処理するのは良い方法ではありません。

+0

ニースの回答、ありがとう – megas

関連する問題