2011-12-21 7 views
1

를 기다리는 나는 다음과 같은 문제가 지겨워 :비동기 결과

나는 페이스 북의 기능 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')를 사용하려면 : 나는 내 목표는이 클래스에서 자주 사용하는 기능을 호출하는 작은 헬퍼 클래스를 만드는 것입니다 등 몇 가지 테스트를 진행하기에 가기 전에 이것의 결과를 기다리지 . 불행히도 if(permissions)FB.Api()이 완료되기 전에 작동합니다. 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()는 두 번째 매개 변수 (function())가 무언가를 반환하는지 여부를 반환합니다. FB.api()의 코드가 처리되고 권한이 부여 될 때 호출 할 hasPermission() - 함수 호출에 콜백 함수를 전달하여이 문제를 해결했습니다. – Denis