我正在开发一个简单的帐户管理页面,用户可以登录,注册等
每个部分都有自己的控制器。即登录页面有一个登录控制器。
这些控制器共享一个公共服务AccountService
来处理登录,注册机制。
这是我的AccountService
:
app.service('AccountService', function($http){
var user = {};
this.isLoggedIn = function(){
return user.isAuth;
};
this.login = function(user, callback){
//...//
if(success){
//Mark user as authenticated
user.isAuth = true;
}
};
});
如您所见,如果我通过AccountService.login(user)
登录,则变量user.isAuth
在成功时设置为true。 但是问题是如果我再调用AccountService.isLoggedIn()
我希望函数返回true
但它返回undefined
例如,如果我这样做:
app.controller('LoginController', function($scope, AccountService) {
$scope.login = function(user) {
//Do Login
AccountService.login(user, function(r){
result = r;
}); //At this point user.isAuth should be true
//Check if user is logged in
console.log(AccountService.isLoggedIn()); //This returns false
}
}
那么如何在服务中保留变量?
修改 @itcouldevenbeaboat建议在由于异步调用而调用第二个函数之前未设置该值。但是,当我将函数调用彼此分开时,它仍然不起作用:
app.controller('LoginController', function($scope, AccountService) {
$scope.login = function(user) {
//Do Login
AccountService.login(user, function(r){
result = r;
}); //At this point user.isAuth should be true
}
$scope.isAuth = function(){
//Check if user is logged in
console.log(AccountService.isLoggedIn()); //This STILL returns false
}
}
当我调用login
函数然后调用isAuth
LoginController
函数时,我仍然会收到错误消息
答案 0 :(得分:2)
您的登录功能是异步的。在数据返回之前,console.log
是否实际运行。
试试这个,
$scope.login = function(user) {
//Do Login
AccountService.login(user, function(r){
result = r;
console.log(AccountService.isLoggedIn()); //This returns true
});
}