如果需要登录,Angularjs$http拦截器会暂停异步请求

Angularjs $http interceptor pause async requests if login required

本文关键字:暂停 请求 异步 http 登录 Angularjs 如果      更新时间:2023-09-26

我的angularjs应用程序中有一个$http

如果我的api返回未经授权的响应,我会显示登录名。

一旦用户通过模态登录,请求拦截器就会重试$http请求。

    app.factory('LoginInterceptor', function ($injector, $timeout, $q) {
    return {
        request: function (config) {
            return config;
        },
        response: function (response) {
            var LoginModalService = $injector.get('LoginModalService'),
                $http = $injector.get('$http'),
                $location = $injector.get('$location'),
                $rootScope = $injector.get('$rootScope'),
                url = response.config.url.split('?')[0];
            if (response.data && response.data.token_status <= 0) {
                return $timeout(angular.noop, 1000).then(function () {
                    return LoginModalService.show();
                }).then(function () {

                    return $http(response.config);
                }, function () {
                    $location.path('/login');
                    return $q.reject(response);
                });
            }
            return response || $q.when(response);
        }
    }
});

问题是,如果多个请求异步触发,则会显示每个请求的登录名。

如何在用户登录之前停止执行所有其他请求?目前,当发出一个请求时,这种方法就可以工作。我不想取消所有其他请求,我希望在用户登录后解决这些请求。

您可以在返回的第一个未授权请求上设置一个标志,并拒绝以下所有未授权请求/响应:

app.factory('LoginInterceptor', function ($injector, $timeout, $q) {
    var isAuthorized = true;
    return {
        request: function (config) {
            if(isAuthorized){
                 return config
            }else{
                 return $q.reject(config);
            }
        },
        response: function (response) {
            var LoginModalService = $injector.get('LoginModalService'),
                $http = $injector.get('$http'),
                $location = $injector.get('$location'),
                $rootScope = $injector.get('$rootScope'),
                url = response.config.url.split('?')[0];
            if (response.data && response.data.token_status <= 0) {
                if(isAuthorized){
                    isAuthorized = false;
                    return $timeout(angular.noop, 1000).then(function () {
                        return LoginModalService.show();
                    }).then(
                        return $http(response.config);
                    }, function () {
                        $location.path('/login');
                        return $q.reject(response);
                    });
                }else{
                    return $q.reject(response)
                }
            }
            return response || $q.when(response);
        }
    }
});