Angularjs 角度:等待应用程序运行以获得响应

Angularjs 角度:等待应用程序运行以获得响应,angularjs,authentication,Angularjs,Authentication,截至,我正在尝试确定用户是否使用基于令牌的身份验证登录 该计划如下: 1/页面加载,调用app run,并将authenticated设置为false作为默认值 app.run(function($http, UserService) { UserService.requestCurrentUser(); $http.defaults.xsrfHeaderName = 'X-CSRFToken'; $http.defaults.xsrfCookieName = 'csr

截至,我正在尝试确定用户是否使用基于令牌的身份验证登录

该计划如下:

1/页面加载,调用app run,并将authenticated设置为false作为默认值

app.run(function($http, UserService) {
    UserService.requestCurrentUser();

    $http.defaults.xsrfHeaderName = 'X-CSRFToken';
    $http.defaults.xsrfCookieName = 'csrftoken';
});

app.constant('AUTHENTICATED', false);
2/UserService调用其方法requestCurrentUser,其中http get被发送到正确的url,其标头中包含令牌

如果令牌是正确的,这将发回用户成功案例,我们将通过身份验证。 如果没有,我会得到一个权限错误案例,我们没有经过身份验证。 这将更新currentUserproperty和已验证的常量

app.factory('UserService', function ($http, $q, $window, AUTHENTICATED) {
    var _currentUser = {};

    return {
        
        getCurrentUser: function() {
            return _currentUser;
        },

        setCurrentUser: function(user) {
            _currentUser = user;
        },

        requestCurrentUser: function() {
            return $http.get('/accounts/api/').then(
                function (response) {
                    _currentUser = response.data;
                    AUTHENTICATED = true;
                },
                function (error) {
                    AUTHENTICATED = false;
                }
            );
        },
    };
});
3/调用并验证控制器,并更新currentUser范围值

app.controller('AuthCtrl', function ($scope, AuthService, UserService, AUTHENTICATED) {
    $scope.authenticated = AUTHENTICATED;
    $scope.currentUser = UserService.getCurrentUser();
});
问题是,控制器试图在应用程序运行中启动的requestCurrentUser方法收到响应之前达到这些值。那么我应该在哪里启动requestCurrentUser来获得预期的行为呢


感谢您所能做的将用户状态对象包装到父对象中。例如:

var state = {
    _currentUser: {}
};

return {
    getUserState: function(){ return state; }
};
然后在控制器内:

$scope.state = UserService.getUserState();

这样,当您的用户无论何时或如何在您的服务中更新时,绑定到该状态的任何内容都将收到更新。因此,您的控制器将有权访问状态。\u currentUser(如果可用)。

感谢您的回答,因为我所经历的应该是相当普遍的,我想知道是否有一个最佳实践可以实现我的目标。我是一个新的角度,我想也许我应该重新思考我的结构更全面?也许app.run不是请求当前用户的地方。拥有管理用户状态的服务是一个不错的选择。如果您将用户包装在容器对象中,并将任何异步相关的进程包装在承诺中,那么您应该做得很好。这样你就可以在任何地方注入你的用户服务,并用它做你想做的事情。对于功能布局没有特定的标准,比如user auth,但是您应该能够找到大量的示例。继续试验并决定什么最适合您。策略可能取决于是否需要阻止路径以及使用哪个路由器。例如,在ui路由器中,可以使用单个父级状态解析,所有需要验证的路由都可以设置为子级状态,如果父级解析被拒绝,则所有子级状态都不可访问。其他策略包括使用route start event解决身份验证此主题的大量教程有此类教程的示例吗?谢谢