2015-06-07 4 views
0

У меня есть этот метод в моей службе, чтобы получить пользователь

getUser : function() { 
    console.log("get user"); 
    token = authService.getToken(); 
    userID = jwtHelper.decodeToken(token); 

    console.log(token); 
    console.log(userID); 

    return $http.get(httpHost + '/users/' + userID).success(function (data) { 
    user = data; 
    console.log(user); 
    return data; 
    }); 
    }, 

Я запустил эту услугу в .run углового Тогда в моем контроллере Я получаю данные, чтобы представить имя пользователя на мой взгляд
$scope.userName = userService.getFirstName() + " " + userService.getLastName();.
Он будет работать большую часть времени, но есть моменты, когда есть задержка в получении пользователя, контроллер будет выполнен, прежде чем оставить $ scope.username с неопределенными значениями.
Как я могу заставить свою программу ждать, пока getUser() вернет данные пользователя перед запуском контроллера?

+0

Вы уверены, что хотите сделать это? Угловые работают асинхронно, и вы пытаетесь запустить синхронный процесс. Обычно при извлечении данных вы показываете некоторую предзагрузочную анимацию (например, пульсации). Затем, когда данные извлекаются, вы удаляете анимацию и заменяете ее фактическими данными. Это можно сделать в чистом CSS или с программным использованием чистого JS или настраиваемой угловой директивы. – eitanfar

ответ

1

$http.get возвращает обещание. Так что вы можете сделать, это всякий раз, когда вы звоните getUser это сделать:

service.getUser().then(function(response){ //stuff you need to do on finish here }); 
+0

Это работает, спасибо – devadnqpnd

0
You need to use $q services 
.ABCController($scope,$http,$q){ 
getUser : function() { 
    var deferred = $q.defer(); 
    console.log("get user"); 
    token = authService.getToken(); 
    userID = jwtHelper.decodeToken(token); 

    console.log(token); 
    console.log(userID); 

    return $http.get(httpHost + '/users/' + userID).success(function (data) { 
    user = data; 
    console.log(user); 
    deferred.resolve(user) 
    return deferred.promise; 
    }); 
    }, 
+0

Есть ли причина, почему в этом случае недостаточно использовать функцию 'then'? –

+0

Функция «then» является свойством $ q (service). Я попытался использовать ее, не указав ее, она дала ошибку. – twitch

+0

Собственно, это не так. https://docs.angularjs.org/api/ng/service/$http Посмотрите на возвращаемое значение. 'then' является функцией, включенной в HttpPromise. У вас должно быть что-то еще, потому что 'then' отлично работает для меня, не включая' $ q'. –