2017-02-06 15 views
0

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

Поэтому я устанавливаю перехватчик ошибок, чтобы поймать 401, и откройте модальный запрос учетных данных. Затем я использую существующий AuthService для запроса токена и возвращает $ http (response.config) с скорректированным токеном.

Вот мой первоначальный запрос:

MyService.getData().then(
    function(result) { 
     console.log("process data"); 
    } 
    , function(response) { 
     console.log("error occurred retrieving data"); 
    } 
); 

Вот моя ошибка перехватчик, реагируя на 401С:

Restangular.setErrorInterceptor(
     function(response) { 
      if (response.status === 401) { 
       console.log("interceptor catches"); 

       var modal = $uibModal.open({ 
        templateUrl: "frame/view/Relogin.html", 
        controller: "ReloginController", 
       }); 

       console.log("opened modal"); 

       return modal.result.then(function(data) { 
        console.log("get new token"); 
        return AuthService.authenticate(data[0], data[1]).then(
         function (token) { 
          console.log("set new token");         
         }, 
         function(){ 
          console.log("failed getting new token"); 
         }) 
         .then(function() { 
          console.log("now rerun request"); 
          return $http(response.config); 
         }); 
       }); 
      } 

      return $q.reject(response); 
     }); 

Что сейчас происходит, является то, что перехватчик ловит 401, и открывает модальное , Но вместо того, чтобы ждать ввода пользователя сейчас и запроса на бэкэнд для нового токена, теперь появляется код ошибки обещания.

Так выход консоли:

interceptor catches 
opened modal 
error occurred retrieving data 

get new token 
set new token 
now rerun request 

Но я хотел, чтобы это было:

interceptor catches 
opened modal 
get new token 
set new token 
now rerun request 
process data 

Я предполагаю, что есть ошибка в использовании обещания ... Может кто-то помочь?

Спасибо!

ответ

0

Похож на то, что я перепутал реставрационные и угловые. Как раз после примера here, я, наконец, выяснил проблему. Настройка перехватчика ошибок в> Угловом < выглядит так:

app.config(function($httpProvider){ 
    $httpProvider.interceptors.push(function($q, $injector) { 
     return { 
      responseError: function(response) { 
       if (response.status === 401) { 
        console.log("interceptor catches"); 

        var modal = $injector.get('$uibModal').open({ 
         templateUrl: "frame/view/Relogin.html", 
         controller: "ReloginController", 
        }); 

        return modal.result.then(function(data) { 

         return $injector.get('AuthService').authenticate(data[0], data[1]).then(
          function (token) { 
           console.log("set new token");         
          }, 
          function(){ 
           console.log("failed getting new token"); 
          }) 
        .then(function() { 
         console.log("now rerun request"); 
         return $injector.get('$http')(response.config); 
        }); 
      }); 
     } 

     return $q.reject(response); 
    });