2016-10-30 7 views
0

私のアプリケーションでは、httoインターセプタを使用して一般的なhttpエラーを処理します。クライアントの側またはサーバーのどちらかにエラーがあることを意味するステータスコードを取得しますサイド私はイベントをブロードキャストし、私はイベントにサブスクライブされapp.runのハンドラ、 、

問題は$ http.successあるが常に実行されていると私は、コントローラのメソッドに

を続けて停止するような角度に伝えるカント以下はアプリの簡略版です

インターセプタ

angular.module('starter.Aop', []) 
    .factory('AuthInspector', ['$rootScope', '$injector', function AuthInspector($rootScope, $injector) { 
     var service = { 
      request: function (config) { 
       var authToken = window.localStorage.getItem('authToken') 
       config.headers.Authorization = 'Bearer ' + authToken; 
       return config 
      }, 
      responseError: function (response) { 

       if (statusCode >= 400) { 
        $rootScope.$emit('someThingWrong') 
        event.preventDefault(); 
       } 

       return response 
      } 
     }; 
     return service; 
    }]); 

app.run

.run(function ($timeout, $ionicPlatform, $rootScope, $state, $cordovaPushV5, $cordovaNetwork, $ionicPopup) { 
      $ionicPlatform.ready(function() { 
         $rootScope.$on('someThingWrong', function() { 
          console.log('someThingWrong') 
          event.preventDefault(); 
          return; 
         }) 

コントローラ

 $scope.logout = function() { 
         $http.post(serverConfig.serverUrl + "/api/account/logoutx").success(function (res) { 
          console.log('methode is successed') 
          //window.localStorage.removeItem('authToken'); 
          //window.loclaStorage.removeItem('userFullName'); 
         }) 
        } 

にconsole.logは( 'Methodeのがsuccessedれる')iは継続コントローラからの角度を停止する方法オールウェイズrunnign

あります方法 ?

+0

が300を超えていても、エラーがあるわけではありません。 3xxコードはリダイレクト用です。 4xxと5xxはエラーです。そして彼らはネイティブに角を扱います。なぜ仕様に固執するのではなく、HTTPを再開発するのですか?適切なステータスコードを使用してエラーを通知します。 –

+0

ok、whethere 300または=> 400 m問題は実行を処理する方法です – user6599525

+0

達成したいことがわかりません。 Angularは既にエラー応答を処理しており、ステータスがエラーステータスの場合は**約束を拒否します**。 success()とerror()は長い間使用されなくなり、1.6の角度で削除されることに注意してください。 then()を使用します。 –

答えて

2

AuthInspectorを成功への拒否に変換します。成功への拒絶反応を変換

angular.module('starter.Aop', []) 
    .factory('AuthInspector', function AuthInspector($q,$rootScope) { 
     var service = { 
      request: function (config) { 
       var authToken = window.localStorage.getItem('authToken') 
       config.headers.Authorization = 'Bearer ' + authToken; 
       return config 
      }, 
      responseError: function onReject(response) { 

       if (response.status >= 400) { 
        $rootScope.$emit('someThingWrong') 
        //event.preventDefault(); 
       } 

       //return response; 
       throw response; 
       //OR 
       //return $q.reject(response); 
      } 
     }; 
     return service; 
    }); 

拒否ハンドラへの応答を返す:

が適切に応答エラーハンドラからの拒絶反応をチェーンに、throwステートメント、またはreturn $q.reject(error)を使用しています。

もう1つの一般的な問題は、拒否ハンドラです。を省略すると、またはreturnとなります。この場合、ハンドラはundefined$qサービスに返します。拒否はに変換され、が成功し、それに続く成功ハンドラが応答引数としてundefinedで呼び出されます。

+0

私はすでに$ q.rejectを使用していましたが、idは私が投げることもできることを知っていませんでした。どうもありがとう。 – user6599525

関連する問題