14

私の angularjs アプリでは、http エラーのデフォルト ハンドラーを次のように定義しました。

myapp.config([ '$httpProvider', function($httpProvider) {
    $httpProvider.responseInterceptors.push('errorInterceptor')
}])

whereerrorInterceptorは、現在のページの上部にあるアラート フィールドにエラーに関する詳細を表示するサービスです。

ここで、特定のエラーを別の方法で処理したい場合 (たとえば、クエリがモーダルでトリガーされ、ページ レベルではなく、このモーダルでのみアラートを表示したい):

$http.get('/my/request').then(success, specificErrorHandling)

Angular はこれを行いspecificErrorHandlingますが、それでも my をトリガーするerrorInterceptorため、エラーが 2 回報告されます。それを回避する方法はありますか?

より一般的には、チェーンに沿ってまだ処理されていないエラーのみを処理するAngularの方法はありpromiseますか?サーバーアプリのトップレベルのエラーハンドラーがキャッチされた例外を処理する必要がないのと同じ方法ですか?

編集:コメントでBeetroot-Beetrootが要求したように、インターセプターのコードは次のとおりです。

@app.factory 'errorInterceptor', [ '$q', 'alertsHandler',
  ($q, alertsHandler) ->
    success = (response) ->
      response

    failure = (response) ->
        alertsHandler.raise(response)

    (promise) ->
      promise.then success, failure
]
4

2 に答える 2

5

私たちはそのようなものを持っています。

http エラーを処理する場合は、というリクエストでプロパティを渡します。errorHandled:true

$http({
    method: 'GET',
    url: '/my/url',
    errorHandled:true
}).then(function(){ ... }, function(){ ... });

そして、インターセプトで、responseError: function(rejection){ ... }このフラグが設定されているかどうかを見て確認できます。設定されていrejection.config.errorHandledない場合は、toastr ダイアログにエラーが表示されます。コードは次のようになります

function ( rejection ) { 
    if ( !rejection.config.errorHandled && rejection.data.message ){
        toastr.error(rejection.data.message, 'Error');
    }
    return $q.reject(rejection); 
} 

ハンドラーを追加せずに「errorHandled:true」を書く可能性はほとんどありません。2 つのエラー インジケーターを使用する可能性も、慣れているためわずかですが、実際には 2 つのインジケーターがある方が、ないよりはましです。

エラー ハンドラーがあるかどうか、またはチェーンの下流にないかどうかをクエリするという約束があれば素晴らしいのですが、thenこれはどこにも見つかりませんでした。

于 2015-04-08T12:54:12.880 に答える
1

どのエラーを抑制する必要があり、どのエラーを伝播する必要があるかを知っていると仮定します。また、Response インターセプターは promise 自体を返す関数であるため、

失敗した場合の応答をキャッチし、それをスタックに伝播する代わりに、空の応答などを返すことができます。

インターセプターのAngularドキュメントのサンプル例を見ると

$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
    return function(promise) {
        return promise.then(function(response) {
            // do something on success
        }, function(response) {
            // do something on error
            if (canRecover(response)) {
                return responseOrNewPromise; // This can suppress the error.
            }
            return $q.reject(response); // This propogates it.
        });
    }
});
于 2013-06-23T05:53:14.460 に答える