Angularjs 尝试以asycn方式初始化服务,但未定义
我正在做一个angularjs项目,遇到了一个问题: 我有一个维护用户登录状态的服务。在服务加载阶段,我希望它可以检查用户是否登录,并加载用户信息,如果他们:Angularjs 尝试以asycn方式初始化服务,但未定义,angularjs,Angularjs,我正在做一个angularjs项目,遇到了一个问题: 我有一个维护用户登录状态的服务。在服务加载阶段,我希望它可以检查用户是否登录,并加载用户信息,如果他们: angular.module('tripod') .factory('UserService', ['$http', function($http) { var self = this, userId = angular.element(document.querySelector('#info-base')).
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;
});
}
};
}]);
信息库中的数据id是用户id,如果他们登录,数据id将嵌入值,他们的配置文件将驻留在服务器的会话中,然后我希望通过http请求获取他们的配置文件。在factory的返回值中,我将属性点设置为用户信息,并认为以后可以使用它
但是当我引用UserService.user时,我没有定义。我知道http承诺不会立即返回,我尝试设置长超时,确保http承诺返回。但是UserService.user的值仍然没有定义
是的,我确实四处搜索过,但我只是想知道为什么上面的代码不起作用
请有人教我,谢谢。请试试这个:
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是一个返回承诺($q)的函数。在控制器中,您将获得“then”块中的值,该值将在调用服务中的d.resolve(sel.user)时触发。我遇到了类似的问题。Javascript是异步的,简短回答您的属性用户应该返回一个承诺。这样,您可以使用类似UserService.user()的内容获取用户。然后(…)。如果这对你来说还不够(对我来说不是),我建议你使用ngRoute或ui路由器“resolve”选项,这样你的控制器只有在承诺得到解决后才会存在。这对你有意义吗?谢谢罗布森,你的建议完全有意义。但我想知道为什么它不起作用。我还在学习angularjs,弄清楚这一点会对我有很大帮助。