2011-07-25 136 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转变为一个同步函数。