0

$http interceptor失敗したときにログインモーダルを表示するために使用してい$authます。ここに私が持っている簡単なセットアップがあります:

$provide.factory('modalWhenLoggedOut', ['$q', '$injector', '$rootScope',
          function($q, $injector, $rootScope) {

        return {

             responseError: function(rejection) {

                 // $injector.get to fix circular dependency error
                 var loginModal = $injector.get('LoginModalService');
                 var $http = $injector.get('$http');
                 var $state = $injector.get('$state');

                 // Check for reasons instead of status code
                 var rejectionReasons = ['token_not_provided', 'token_expired', 'token_absent', 'token_invalid'];

                 // Loop through each rejection reason and redirect
                 angular.forEach(rejectionReasons, function(value, key) {

                     if(rejection.data.error === value) {
                        // Show the login modal
                         var deferred = $q.defer();

                         loginModal()
                           .then(function () {
                             deferred.resolve( $http(rejection.config) );
                         })
                         .catch(function () {
                             $state.go('index');
                             deferred.reject(rejection);
                        });

                        return deferred.promise;
                     }
                 });

                 return $q.reject(rejection);
             }
         }
}]);

// Push the new factory onto the $http interceptor array
$httpProvider.interceptors.push('modalWhenLoggedOut');

上記のコードは正常に動作します。しかし、私が抱えている問題は、API が複数の認証失敗エラーをスローすると、インターセプターが複数のモーダルを同時に開くことです。通常、1 ページでバックエンド API に接続するさまざまなサービスが 2 ~ 3 回あり、認証が失敗すると、それらのすべての API が無効なトークンの間に認証失敗エラーを返します。このインターセプターは、3 つの take_invalid エラーとしてそれを検出し、3 つのログイン モーダルを 1 つずつ重ねて表示します。これを防ぐにはどうすればよいですか?

認証失敗が何回発生しても、インターセプターが 1 つのログインモーダルのみを表示するようにするにはどうすればよいですか?

私のサービスは次のようになります。

.service('LoginModalService', ['$modal', '$rootScope', 
            function($modal, $rootScope) {

                    function updateRootScope() {
                            $rootScope.loginProgress = false;
                    }

                  if ($rootScope.loginProgress = false) {
                    return function() {
                      var instance = $modal.open({
                        templateUrl: rootPath + 'views/partials/LoginModalTemplate.html',
                        controller: 'LoginModalCtrl'
                      })

                    return instance.result.then(updateRootScope);
                  };
                  }
}])

サービスでは$rootScope.loginProgress、ログインモーダルが開いているかどうかを判断するためのスイッチとして使用しようとしています。$rootScope.loginProgressただし、モーダルが既に開かれている場合(true の場合)に空の promise を返す方法がわかりません。

4

1 に答える 1