2016-04-27 3 views
0

У меня есть $http в моем приложении angularjs.

Если мой 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); 
     } 
    } 
}); 

Проблема заключается в том, что при многократном запросе асинхронно запускается логин для каждого запроса.

Как я могу остановить выполнение всех других запросов до входа пользователя в систему? В настоящее время это работает, когда выполняется один запрос. Я не хочу, чтобы отменить все другие запросы, я хочу, чтобы решить, как только пользователь вошел в

+0

Что вы подразумеваете под "pause"? Вы хотите отменить все параллельные запросы во время показа модаля или выполнить их после входа пользователя в систему? –

+0

Выполните их, как только пользователь выполнит вход. - См. Редактирование на вопрос – CharliePrynn

+0

Я написал завод для лучшего контроля. есть [посмотреть] (https://www.npmjs.com/package/angular-httpshooter) – Siddharth

ответ

0

вы можете установить флаг на первый несанкционированный запросе возвращаются, и отклонить весь следующий неавторизованный запрос/ответ:.

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); 
     } 
    } 
}); 
+0

Я не хочу, чтобы запросы были отклонены, я хочу, чтобы они разрешались после входа пользователя. – CharliePrynn

+0

, тогда вам нужно чтобы сохранить эти обещания запроса/ответа, скажем, положить их в массив, после входа пользователя, разрешить все обещания в этом массиве – MarkoCen

Смежные вопросы