2011-12-21 113 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