2011-12-21 15 views
1

私は、次のような問題のうんざりだ:非同期結果を待っている

私はFacebookの機能FB.api()を使用して、いくつかの権限のためのFacebooksのAPIを問い合わせます。私はいくつかのテストを続行するために行く前に、私の目的は、このクラスで頻繁に使用する機能を呼び出すために小さなヘルパークラスを作成することであるなど、この結果を待ちたい:

var fbHelper = { 

    hasPermission: function(permission) { 

      var hasPermission = false; 
      var requestedPermissions = false; 
      var permissions = { }; 

      FB.api('/me/permissions', function(response){  

       permissions = response; 
       requestedPermissions = true; 
       return response; 
      }); 

      if(permissions){ 
       // make some checking stuff here 
       return hasPermission; 
      } else { 
       console.log('failed to /me/permissions'); 
       return false; 
      }   
    } 
} 

は、だから私はfbHelper.hasPermission('dummy')を使用したいです。残念ながら、FB.Api()が完了する前にif(permissions)が働いています。 Api-Callが完了するまで、残りのコードを待つ方法を教えてください。

答えて

1

非同期要求を実行し、結果を確実に返すことができると期待する関数を実際に書くことはできません。次のように私はあなたのヘルパーメソッドを再構築します:

hasPermission: function(permission, callback) { 

     var hasPermission = false; 
     var requestedPermissions = false; 
     var permissions = { }; 

     FB.api('/me/permissions', function(response){  

      permissions = response; 
      requestedPermissions = true; 
      if (permissions) { 
       callback(permissions); 
      } else { 
       callback(false); 
      } 
     });  
} 

は、AJAX呼び出しが完了したときに実行されるコードの供給にコールバック関数を呼び出してみましょう。

+0

うん感謝を。私はあなたの提案のようにそれをやった。この関数は3つのパラメータ(scope、callback_success、callback_error)を処理できるようになりました – Denis

0

function(response){}のように、非同期の場合はコールバックが必要です。 javascriptが終了するのを待たないという事実は、非同期呼び出しの全目的です。

1

あなたは、コールバックにコードを移動し、そこから返す必要があります:

return FB.api('/me/permissions', function(response){  
    // this is your callback 
    permissions = response; 
    requestedPermissions = true; 
    if(permissions){ 
     // make some checking stuff here 
     return hasPermission; 
    } else { 
     console.log('failed to /me/permissions'); 
     return false; 
    }  
}); 
+0

問題は、内部戻り値がFB.api戻り値として設定されていないことです。 FB.api()は、2番目のパラメータ(function())が何かを返すかどうかを返しません。 私は、FB.api()のコードが処理され、アクセス権が与えられたときにコールするコールバック関数をhasPermission() - 関数呼び出しに渡すことで問題を解決しました – Denis