在AngularJS中初始化应用程序启动时的当前用户服务

时间:2016-08-06 23:26:59

标签: javascript angularjs authentication cookies service

我正在使用AngularJS开发单页应用程序。

当用户成功登录时,安全令牌存储在cookie中。现在,当他刷新页面时,令牌将被发送到后端,后端返回一个JSON对象“currentUser”,其中包含有关当前用户的所有相关信息(如名称,访问组,个人资料图片等)。 / p>

问题是,这当然是一个异步过程,所以当控制器启动另一个操作时,比如只提醒用户的名字,那个时候这个值就不确定了。

当然,我可以设置超时但是有更好的解决方案吗?

我想到了一个“currentUserService”,它首先初始化(发送cookie并用后端响应填充用户信息),并且只能在初始化完成后进行处理。

但是怎么办呢?或者还有其他可能吗?

编辑: 嗨,大家好, 谢谢你的意见!

对于异步请求,您的两个建议似乎都非常有希望,但我认为它们可能不适合我的关注:

有关当前用户的信息只需要一次,因此我希望存储整个应用程序(例如在rootScope或服务中)可以从任何控制器访问,而无需在每个控制器中再次请求它们(如在回调或解决方案中),但要确保不会出现任何“超时”问题。你有什么想法吗?

2 个答案:

答案 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-routeui-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;
});

请注意,如果在解决阶段出现任何错误,将不会加载状态,因此您必须处理错误!