-1

如何在“检查用户的登录状态”功能之前触发 authCheck 工厂?

我正在尝试检查$rootScope路由和 http 请求的状态:

//Global Logout Function
myApp.run(function($rootScope, $http) {
    $rootScope.logout = function() {
        $http.post('/api/auth/logout');
    };
});
//Check Login state of user
myApp.run(function($rootScope, $http, $window) {
    $rootScope.$on('$routeChangeStart', function () {
        $http.get('/api/auth')
        .then(function successCallback(response) {
            $rootScope.logStatus = response.data.data.loggedIn;
            console.log('initial ' + $rootScope.logStatus);
        }, function errorCallback(response) {
            $rootScope.logStatus = response.data.data.loggedIn;
        });
    return $rootScope.logStatus;
    });

});
//Check for authenticated users on http requests (API calls and Routing changes) and redirect to login if logged out
myBirkman.factory('authCheck', ['$rootScope','$window', function($rootScope, $window) {  

var authCheck = {
    'request': function(config) {
        if ($rootScope.logStatus == true) {
            //do nothing
            console.log('redirect ' + $rootScope.logStatus);
        } else if ($rootScope.logStatus == false) {
            $window.location.href = '/login.php';
        }
    },
    'response': function(response) {
return response;
    }
};
return authCheck;
}]);




// Define routing within the app
myApp.config(['$httpProvider', '$routeProvider', function($httpProvider, $routeProvider) {  
$httpProvider.interceptors.push('authCheck');

我试图将 $rootScope 元素转换为常量,但同样的问题出现了。工厂在 run 函数之前运行,因此直到工厂运行之后才会更新常量。

4

2 回答 2

0

如果在 promise 解决后填充了值,则您无法确定是否存在该值。您将无法获得正确的值,$rootScope.logStatus因为它仅在$http.get调用完成后才填充,这可能发生在您的工厂代码完成执行之后

于 2016-05-10T17:37:55.323 回答
0

非常感谢阿迪亚。解决方案是我对拦截器函数的格式不正确。重新格式化后,我的代码就像一个魅力。请注意,不要忘记将请求中的配置和响应中的响应都传回,以便您的请求仍然按预期运行。

于 2016-05-10T22:15:33.573 回答