我正在做一个angularjs项目并遇到了一个问题:
我有维护用户登录状态的服务。在服务阶段加载,我想它可以检查用户是否登录,并加载用户信息,如果他们是:
angular.module('tripod')
.factory('UserService', ['$http', function($http) {
var self = this,
userId = angular.element(document.querySelector('#info-base')).attr('data-id');
if (userId)
$http.get('/session').then(function(response) {
self.user = response.data;
});
return {
user: self.user,
signup: function(user) {
return $http.post('/signup', user);
},
login: function(user) {
var self = this;
return $http.post('/login', user).then(function(response) {
self.user = response.data;
return self.user;
});
},
logout: function() {
return $http.get('/logout').then(function() {
self.user = null;
});
},
session: function() {
var self = this;
return $http.get('/session').then(function(response) {
self.user = response.data;
return response;
});
}
};
}]);
info-base中的data-id是用户的id,如果他们已登录,则data-id将嵌入值,并且他们的配置文件将驻留在服务器的会话中,然后我想通过http请求获取他们的配置文件。在工厂的返回值中,我将属性指向用户信息,并认为我以后可以使用它。
但是当我引用UserService.user时,我得到了未定义。我知道http promise不会立即返回,我尝试设置一个很长的超时,确保http promise返回。但UserService.user的值仍未定义。
是的,我确实搜索了this,但我只是想知道为什么上面的代码不起作用。
请某人教我,谢谢。答案 0 :(得分:0)
请试试这个:
angular.module('tripod')
.factory('UserService', ['$http', '$q', function ($http, $q) {
var self = this,
userId = angular.element(document.querySelector('#info-base')).attr('data-id');
return {
user: function(){
var d = $q.defer();
if (userId)
$http.get('/session').then(function (response) {
self.user = response.data;
d.resolve(self.user);
});
return d.promise;
}
};
}]).controller('myCtrl', function (UserService) {
UserService.user().then(function (user) {
// get your user here
});
});
我删除了一些功能,只关注重要问题。请注意,现在user是一个返回promise(https://docs.angularjs.org/api/ng/service/ $ q)的函数。在您的控制器中,您将获得'然后'阻止,当你的服务中的d.resolve(sel.user)被调用时将被触发。