2015-11-08 2 views
0

Я пытаюсь сделать государственную навигацию при получении запрещенного или несанкционированного HTTP-запроса с использованием http-перехватчиков, но я получаю сообщение об ошибке $ state.go

Error: transition superseded

Это мой responseError перехватчик:

angular.module('starter') 

.factory('httpResponseInterceptor', function($injector) { 
    return { 
     responseError: function(errorResponse) { 

      var loginParams = { 
       info: true, 
       reason: 'Please login.', 
       title: errorResponse.data 
      }; 
      var $state = $injector.get('$state'); 

      switch (errorResponse.status) { 
       case 403: 
        $state.go('login', loginParams).then(function() {}, function(res) { 
         console.log(res); 
        }); 
        break; 
       case 401: 
        $injector.get('$state').go('login', loginParams); 
        break; 
      } 

      return errorResponse; 
     } 
    }; 
}); 

есть ли способ использовать перехватчик в этом случае? Обманирование тайм-аута вокруг $ state.go сделает трюк, хотя

ответ

0

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

Я всегда явно отвергают настоящее разрешающую обещание, которое перехватывается перехватчик ошибок:

вместо того, чтобы делать return errorResponse; вы должны вводить $q службу в перехватчик и сделать return $q.reject(errorResponse);

2

Во-первых, это не перехватчика работу по выполнению действий пользовательского интерфейса. Должен быть AuthService/Provider/Controller, где вы должны отправить данные, захваченные перехватчиком, и на основе этих данных предпринять необходимые действия. Вы можете использовать либо систему событий, либо вызвать метод внутри службы.

Это может не решить вашу проблему, но это решит ваши будущие проблемы.

Привет из Клужа.

0

@FlorianTopf сказал, что вы, вероятно, уже находитесь в состоянии перехода. Вы можете рассмотреть $ stateChangeError Событие:

$rootScope.$on('$stateChangeError', 
     function(event, toState, toParams, fromState, fromParams, error) { 
      console.log(event, toState, fromState, error); 
      if (something) { 
       $state.go('error', toParams, { 
        reload: false 
       }); 
      } 
     });