Javascript 处理异步回调

Javascript 处理异步回调,javascript,asynchronous,callback,Javascript,Asynchronous,Callback,我有以下功能: 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 get

我有以下功能:

    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;
}
这将检查Google Chrome中是否有一个标签是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;
}
该函数永远不会返回,但如果我使用alert()并在一瞬间停止该函数,则会得到正确的返回值。
如何在不使用此警报()的情况下返回正确的值?

您是否考虑过像这样使用回调函数

fbOpenResponse(isOpened){
    // do stuff
}
当您找到(或不找到)fb窗口时调用

它可能很有用。

你做错了

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.

您的问题是Javascript可能是不同步的,但它不是并行的。繁忙循环将永远运行,并且永远不会停止,以便在完成后让getAll有机会运行

根据Hello71的回答,您需要做的是接受同步性是“传染性”的事实,并将iFaceBookOpen转换为一个同步功能