2016-01-28 2 views
0

Я перед перезвонить проблема при вызове функции службывопрос обратного вызова в angularjs директиве

Вот моя функция, определенная в registrationService

function hasUserAccessToLevel(incentiveLevel, callback, showRegistrationView) { 

      var url = "..."; 
      httpWrapperService.get(url) 
       .then(
       function success(data) { 
        var hasAccess = incentiveLevel <= data.Level; 
        callback(hasAccess); 
        if (showRegistrationView && hasAccess == false) { 
         showRegistrationViewForLevel(incentiveLevel); 
        } 
       }, 
       function error(errorObject) { 

        alert("User has not access\r\nTODO : show popup for registration/login"); 
       } 

      ); 
      return false; 
     } 

и В моей директиве я использую эту функцию

function checkAuthentication() { 
       registrationService.hasUserAccessToLevel(2, function (hasAccess) { 
        if (hasAccess == false){ 
         return false; 
        } 
        else{ 
         return true; 
        } 
       }); 
      } 




function loadDocuments() { 
       var target=checkAuthentication() 
       if(target) 
       { 
        //load both private and public 
       } 
       else 
       { 
        // load only public 
       } 

      } 

Теперь проблема, с которой я столкнулся, у меня есть другая функция loaDocuments, когда пользователь вошел в систему, он должен войти внутрь if(target), но когда я отлаживаю функцию, она говорит, что цель не определена, и, следовательно, элемент управления будет еще частью, что неверно. Я знаю, что есть некоторая проблема обратного вызова, но не знаю, как ее исправить.

Любая помощь является приемлемой. Спасибо

+1

'метод checkAuthentication' это ничего не возвращает так возвращаемое значение будет всегда' undefined' – vpsingh016

ответ

0

Вы должны использовать услугу $q. checkAuthentication() возвращает undefined, потому что hasUserAccessToLevel() является асинхронным и во время вызова не имеет возвращаемого значения. Решение состоит в возврате объекта promise.

Вы код можно записать так:

function checkAuthentication() { 
    var defer = $q.defer(); 
    registrationService.hasUserAccessToLevel(2, function (hasAccess) { 
     defer.resolve(hasAccess); 
    }, function() { 
     defer.reject(); 
    }); 
    return defer.promise; 
} 

function loadDocuments() { 
    checkAuthentication().then(function (target) { 
     if (target) { 
      //load both private and public 
     } 
     else { 
      // load only public 
     } 
    }); 
}