2011-08-05 93 views
2

我正在建立我的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所有時間返回零。

可能是什麼樣的問題? 謝謝。

回答

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來遍歷數組不是一個好習慣。

+0

不錯的答案,謝謝 – megas