2011-07-25 17 views
1

私は、次の機能があります:GoogleのChromeのタブのいずれかがfacebookであるかどうかを確認する取り扱い非同期コールバック

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; 
} 

を。問題は、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であってもよいことであるが、それはをparellelされていません。ビジー・ループは永遠に実行され、完了後にgetAllが実行される機会を与えるために停止しません。

あなたがしなければならないことは、非同期性が「伝染性」であり、IsFacebookOpenを非同期関数にすることです。

関連する問題