2011-11-18 83 views
0

這是我有史以來所面臨的最惱人的問題:爲什麼我的全局變量不被另一個函數看到?

var appslst = []; 
function f1() 
{ 
    chrome.management.getAll(function(lst) 
    { 
    appslst = lst; 
    }); 
} 

function f2() // this function isn't working!! 
{ 
    var l = appslst.length; 
    var ind = 0; 
    while(ind < l) 
    { 
     document.getElementById("here").value = document.getElementById("here").value.concat(String(ind), ". ", appslst[ind].name, "\n"); 
     ind += 1; 
    } 
} 

function f3() 
{ 
    f1(); 
    f2(); 
} 

我相信appslst - 因爲它是一個globla變量 - 應該在這兩個功能可見f1()f2() ,但上面的代碼不工作,我不知道爲什麼。

另外,我曾嘗試下面的代碼(它的工作):

var appslst = []; 
function f1() 
{ 
    chrome.management.getAll(function(lst) 
    { 
     appslst = lst; 
     var l = appslst.length; 
     var ind = 0; 
     while(ind < l) 
     { 
      document.getElementById("here").value = document.getElementById("here").value.concat(String(ind), ". ", appslst[ind].name, "\n"); 
      ind += 1; 
     } 
    }); 
} 

任何幫助是非常讚賞:)提前:)

更多的細節 感謝: 我學習如何爲Google Chrome構建擴展程序。 我已經下載了樣本:http://code.google.com/chrome/extensions/examples/extensions/app_launcher.zip 從這個鏈接:http://code.google.com/chrome/extensions/samples.html 我看了一遍代碼,發現我寫的代碼相同,只是它工作正常! 下面是我在談論的部分:

function onLoad() 
{ 
    chrome.management.getAll(function(info) 
    { 
    var appCount = 0; 
    for (var i = 0; i < info.length; i++) { 
     if (info[i].isApp) { 
     appCount++; 
     } 
    } 
    if (appCount == 0) { 
     $("search").style.display = "none"; 
     $("appstore_link").style.display = ""; 
     return; 
    } 
    completeList = info.sort(compareByName); 
    onSearchInput(); 
    }); 
} 

回答

2

chrome.management.getAll是異步的 - 因此你需要傳遞只在Chrome執行完畢getAll時執行的功能。

這意味着f1(); f2();會是這樣的:

  • f1
  • getAll被稱爲(這是f1正在做)
  • f2
  • 循環訪問appslst(那是什麼f2正在做)
  • (一段時間之間)
  • getAll完成;傳遞給它的函數被調用
  • appslst充滿了數據從getAll(這就是傳遞函數是做)

換句話說,appslst仍然是空的時候f2被調用。所以你需要暫停f2()以及:

chrome.management.getAll(function(lst){ 
    appslst = lst; 
    f2(); // only run when getAll is done and appslst is filled 
}); 
+0

那麼爲什麼樣本的代碼是woking?注意'completeList'也是一個全局變量。感謝您的幫助:) – joker

+0

如果您的意思是最後一個代碼示例 - 它們也在傳遞給'getAll'的函數中進行迭代,並且當時您想要迭代的數據可用。 – pimvdb

+0

只有2個最後的問題:1.如果我想將數據複製到全局變量,我應該怎麼做? 2.有什麼鏈接可以學到更多? – joker

相關問題