2011-12-21 111 views
1

我生病了以下問題:等待異步結果

我通過使用Facebook功能FB.api()查詢一些權限Facebook的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') 。不幸的是if(permissions)FB.Api()完成之前工作。 如何才能實現等待我的代碼的其餘部分,直到Api-Call完成?

回答

1

您無法真正編寫執行異步請求的函數,並希望能夠可靠地返回結果。我想如下調整你的helper方法:

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個參數(作用域,callback_success,callback_error) – Denis 2012-01-23 10:49:38

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()都不會返回任何結果。 我已經解決了這個問題,通過將回調函數傳遞給hasPermission()函數調用來處理FB.api()中的代碼,並且授予了權限 – Denis 2012-01-03 16:27:51