我有以下功能:
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()并暂停函数一秒钟,我会得到正确的返回值。 如何在不使用此警报()的情况下返回正确的值?
答案 0 :(得分:1)
您是否考虑过使用像
这样的回调函数fbOpenResponse(isOpened){
// do stuff
}
当你找到(或没有)fb窗口时你打电话......
它很有用。
答案 1 :(得分: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.
答案 2 :(得分:0)
你的问题是Javascript可能是同步的,但不是parellel 。繁忙的循环将永远运行,永远不会停止,以便getAll在完成后运行。
根据Hello71的回答,您需要做的是充实同步性是“具有传染性”并将IsFacebookOpen变成同步函数。