我尝试为我的用户创建服务。我使用请求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;
}
}
};
});
不幸的是,我的请求时间很少,因为承诺没有立即得到解决。 我该如何解决这个问题,以确保一次调用我的服务器。
如何从我的控制器调用此函数,因为有时候返回值是一个promise,所以我使用.then(),有时它将是currentUser的值。
答案 0 :(得分: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;
}
}
};