javascript - チェーン - then catch angularjs




Angular:未処理のhttpエラーに対するデフォルトのハンドラ (2)

そのようなものがあります。

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

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

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

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

誰かがハンドラを追加せずに "errorHandled:true"を書く可能性はわずかです。 2つのエラーインジケーターを持つ可能性も、慣れてきたためにわずかですが、実際には2つのインジケーターがどれもないよりはましです。

エラーハンドラがあるか、それともその時点で使用されていない場合にクエリを実行するという約束があれば、それは素晴らしいことですが、これはどこにも見つからなかったのです。

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

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

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

では、特定のエラーを別の方法で処理したい場合(クエリはモーダルで起動され、アラートはこのモーダルでのみ表示し、ページレベルでは表示しないとします)。

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

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

より一般的には、 promiseチェーンではまだ処理されていないエラーのみを処理するAngularの方法があります。これは、サーバーアプリケーションの最上位のエラーハンドラがキャッチした例外を処理する必要がないのと同じです。

編集:コメントでBeetroot-Beetrootによって要求されるように、ここに私のインターセプターのためのコードがあります:

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

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

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

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

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

インターセプターの角度付きドキュメンテーションのsample例を見ると

$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.
        });
    }
});






promise