2011-12-21 2 views
1

Я болен следующая проблема:Ожидание асинхронного результата

Я запрос API Facebooks для некоторых разрешений с помощью функции facebook FB.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()) возвращать что-то или нет. Я решил проблему, передав функцию обратного вызова вызову функции hasPermission() для вызова при обработке кода в FB.api() и предоставлении разрешения – Denis

Смежные вопросы