2011-07-25 175 views
1

我有以下功能:處理異步回調

function IsFacebookOpen() { 
    var url; 
    var facebookFound = false; 
    chrome.windows.getAll({"populate":true}, function(getInfo) { 
     for(var j = 0; typeof getInfo[j] != "undefined"; j++) { 
      for(var i = 0; typeof getInfo[j].tabs[i] != "undefined"; i++) { 
       url = getInfo[j].tabs[i].url; 
       if(url.substr(url.indexOf("facebook", 0), url.indexOf(".com", 0)-url.indexOf("facebook", 0)) == "facebook") { 
        facebookFound = true; 
       } 
      } 
     } 
    }); 
    return facebookFound; 
} 

來檢查,如果谷歌瀏覽器的標籤之一就是Facebook。問題是chromewindows.getAll是異步的,所以在所有選項卡都可以被檢查之前,函數會返回。這意味着返回值始終爲FALSE,因爲在返回之前沒有選中選項卡。如果我強迫的功能做等待以下內容:

function IsFacebookOpen() { 
    var url; 
    var facebookFound = false; 
    var done = false; 
    chrome.windows.getAll({"populate":true}, function(getInfo) { 
     for(var j = 0; typeof getInfo[j] != "undefined"; j++) { 
      for(var i = 0; typeof getInfo[j].tabs[i] != "undefined"; i++) { 
       url = getInfo[j].tabs[i].url; 
       if(url.substr(url.indexOf("facebook", 0), url.indexOf(".com", 0)-url.indexOf("facebook", 0)) == "facebook") { 
        facebookFound = true; 
        done = true; 
       } 
      } 
     } 
     done = true; 
    }); 
    while(!done) { }; 
    return facebookFound; 
} 

函數永遠不會返回,但如果我用一個警報()和暫停功能的一瞬間,我得到正確的返回值。 如何在不使用此警報()的情況下返回正確的值?

回答

1

你有沒有想過使用回調函數一樣

fbOpenResponse(isOpened){ 
    // do stuff 
} 

那你打電話的時候,你發現(或沒有)FB窗口...

它可以是有用的。

1

你做錯了。

function IsFacebookOpen(callback) { 
    var url; 
    chrome.windows.getAll({"populate":true}, function(getInfo) { 
      for(var j = 0; typeof getInfo[j] != "undefined"; j++) { 
      for(var i = 0; typeof getInfo[j].tabs[i] != "undefined"; i++) { 
       url = getInfo[j].tabs[i].url; 
       if(url.substr(url.indexOf("facebook", 0), url.indexOf(".com", 0)-url.indexOf("facebook", 0)) == "facebook") { 
        callback(true); 
       } 
      } 
     } 
     callback(false); 
    }); 
} 

// calling: 
IsFacebookOpen(function (facebookOpen) { 
    // insert code here 
}); 

以類似的方式來:

window.setTimeout(function() { 
    // You put the code in here... 
}, timeout); 
// ... not in here. 
0

你的問題是,JavaScript可能assynchronous但不中並行。繁忙的循環將永遠運行,並且永遠不會停下來,讓getAll在完成後運行。

你需要做的是吸收這樣一個事實,即異步性是「具有感染力」,並根據Hello71的回答將IsFacebookOpen轉變爲一個同步函數。