2017-02-06 6 views
0

私のWeb-appからサービスに問い合わせると約束しています。トークンが無効な場合は、モーダルを使用してユーザーに資格情報を要求し、バックエンドからの新しいトークンを照会し、失敗した要求を再実行し、何も起こらないために続行するという私の最初の要求の約束の成功ブロックに戻る。角度エラー・インターセプタでモーダル・プロミスを待っています

私は401を捕まえるためのエラーインターセプターをセットアップし、資格情報を求めるモーダルを開きました。次に、既存のAuthServiceを使用してトークンを照会し、調整されたトークンで$ http(response.config)を返します。ここで

は私の最初の要求である:ここでは

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

は401Sに反応し、私のエラーインターセプタです:

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

私は、RestangularとAngularを混在させるように見えます。ちょうど例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); 
    }); 
関連する問題