我正在使用AngularJS开发单页应用程序。
当用户成功登录时,安全令牌存储在cookie中。现在,当他刷新页面时,令牌将被发送到后端,后端返回一个JSON对象“currentUser”,其中包含有关当前用户的所有相关信息(如名称,访问组,个人资料图片等)。 / p>
问题是,这当然是一个异步过程,所以当控制器启动另一个操作时,比如只提醒用户的名字,那个时候这个值就不确定了。
当然,我可以设置超时但是有更好的解决方案吗?
我想到了一个“currentUserService”,它首先初始化(发送cookie并用后端响应填充用户信息),并且只能在初始化完成后进行处理。
但是怎么办呢?或者还有其他可能吗?
编辑: 嗨,大家好, 谢谢你的意见!
对于异步请求,您的两个建议似乎都非常有希望,但我认为它们可能不适合我的关注:
有关当前用户的信息只需要一次,因此我希望存储整个应用程序(例如在rootScope或服务中)可以从任何控制器访问,而无需在每个控制器中再次请求它们(如在回调或解决方案中),但要确保不会出现任何“超时”问题。你有什么想法吗?
答案 0 :(得分:0)
如果用户刷新,则必须初始化所有内容。我假设令牌存储在localstorage或其他东西,我认为这是角度1. *。为此,我认为您应该从http call-callback调用与用户相关的函数:
$scope.user = {};
$scope.getUser = function(){
$http({
method: 'GET',
url: '/someUrl'
}).then(function (res) {
$scope.user = res.data; //or whatever the response is
$scope.handleUserRelatedThings();
}).catch(function(err) {
//handle error
})
}
$scope.handleUserRelatedThings = function(){
//do things with $scope.user
alert($scope.user.name);
}
//on init
$scope.getUser();
答案 1 :(得分:0)
您可以在使用ng-route
或ui-router
加载视图之前解析用户的数据:
此示例是为ui-router
编写的:
.state('profile', {
url: '/profile',
controller: 'profileCtrl as vm',
resolve: {
user: function(AuthService) {
//Return a promise or an object to be resolved.
return AuthService.getUserFromToken(); //Say this is asynchronous and returns a promise
}
}
});
//In controller:
.controller('profileCtrl', function(... , user) {
//User data available here
this.user = user;
});
请注意,如果在解决阶段出现任何错误,将不会加载状态,因此您必须处理错误!