2013-11-08 2 views
1

Я пытаюсь создать сервис для своего пользователя. Я использую запрос http для получения текущего пользователя. Чтобы избежать вызова моего сервера каждый раз, когда я вызываю userService.getCurrentUser(), я попытался отправить переменную, если запрос уже отправлен или вызывается сервером, если он первый раз.

Вот моя служба:

angular.module('UserService', []) 
.factory('UserService', function($q , $http, $rootScope,$timeout) { 
    var currentUser = null; 

    return { 
     getCurrentUser: function() { 
       if (currentUser == null){ 
       var config = {}; 

       config.cache = true; 
       config.method = "GET"; 
       config.url = "users/get_current_user"; 
      return $http(config) 
       .then(function(response) { 
        if (typeof response.data === 'object') { 
          currentUser = response.data.user; 
         return response.data.user; 
        } else { 
         // invalid response 
         return $q.reject(response.data); 
        } 

       }, function(response) { 
        // something went wrong 
        return $q.reject(response.data); 
       }); 
       } 
       else{ 
        return currentUser; 
       } 
     } 
     };  
}); 

К сожалению, я называю запрос несколько раз, потому что обещание не сразу решен. Как я могу исправить это, чтобы сразу вызвать свой сервер.

И как вызвать эту функцию у моего контроллера, потому что некоторое время возвращаемое значение является обещанием, поэтому я использую .then(), и когда-то это будет значение currentUser.

ответ

2

Что вам нужно будет сэкономить (и вернуться в будущих призывах) - это само обещание. Таким образом, это гарантирует, что:

  1. Вы всегда получите объект обещания от вашей функции (последовательное поведение)
  2. Вы никогда не будете стрелять более одного запроса.

Вы можете добиться этого путем изменения кода следующим образом:

angular.module('UserService', []) 
.factory('UserService', function($q , $http, $rootScope,$timeout) { 
    var currentUserPromise = null; 

    return { 
     getCurrentUser: function() { 
      if (currentUserPromise === null) { 
       var config = {}; 

       config.cache = true; 
       config.method = "GET"; 
       config.url = "users/get_current_user"; 
       currentUserPromise = $http(config) 
        .then(function(response) { 
         if (typeof response.data === 'object') { 
          return response.data.user; 
         } else { 
          // invalid response 
          return $q.reject(response.data); 
         } 
        }, function(response) { 
         // something went wrong 
         return $q.reject(response.data); 
        }); 
      } 
      return currentUserPromise; 
     } 
    } 
}; 
+0

Здравствуйте urish, первый ТНХ для вашего ответа. Отлично, это хорошо работает, поэтому, чтобы получить данные в моем контроллере, мне нужно сделать это: UserService.getCurrentUser(). Then (function (user) {$ scope.currentUser = user;}) вместо этого $ scope.currentUser = UserService.getCurrentUser() ?? это немного ограничивает. – FlavienBert

+0

Вы приветствуете Flavien! Ну, перед AngularJS 1.2.0 вы могли бы уйти с назначением возвращенного обещания непосредственно в область действия, и это будет работать так, как ожидалось, но поскольку угловой 1.2.0-rc3 устарел (см. Https://github.com/angular/ angular.js/issues/4158), и вы должны явно вызвать .then() в своем контроллере, как вы упомянули. – urish

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