Я пытаюсь создать сервис для своего пользователя. Я использую запрос 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.
Здравствуйте urish, первый ТНХ для вашего ответа. Отлично, это хорошо работает, поэтому, чтобы получить данные в моем контроллере, мне нужно сделать это: UserService.getCurrentUser(). Then (function (user) {$ scope.currentUser = user;}) вместо этого $ scope.currentUser = UserService.getCurrentUser() ?? это немного ограничивает. – FlavienBert
Вы приветствуете Flavien! Ну, перед AngularJS 1.2.0 вы могли бы уйти с назначением возвращенного обещания непосредственно в область действия, и это будет работать так, как ожидалось, но поскольку угловой 1.2.0-rc3 устарел (см. Https://github.com/angular/ angular.js/issues/4158), и вы должны явно вызвать .then() в своем контроллере, как вы упомянули. – urish