2017-10-25 17 views
0

私のカスタム例外Handlerは、例外が発生するたびに(https://docs.angularjs.org/api/ng/service/ $ exceptionHandlerの例に似ています)、いつでも$http以上のロギングイベントを送信しています。

angular. 
    module('exceptionOverwrite', []). 
    factory('$exceptionHandler', ['$log', '$http', function($log, $http) { 
    return function myExceptionHandler(exception, cause) { 

     $http.post('myUrl.com/logErrors', cause); 
     $log.warn(exception, cause); 

    }; 
    }]); 

これは、そうでない場合を除き...希望通りに動作します

問題:

角度の用途がビューにコントローラからのロジックをバインドするをデータバインディング。しかし、これはこの星座に無限大のループを引き起こしているようです。

  1. このようにビューにバインドされた関数でエラーが発生すると、Exceptionハンドラがトリガされます(必要に応じて)。
  2. ロギングイベントは
  3. $ http経由で送信されるサーバーがで応答し、いくつかのHTTPステータスコード
  4. AngularJSは$ HTTP応答で私のビューを更新しようと$applyを呼び出します(!!)
  5. すべてビューにバインドされた関数が再評価される
  6. ステップ1の例外を引き起こした条件が今までに魔法上消えない限り、別の例外がスローされ、ステップ1からやり直す。

質問:

がどのように私は、サーバーが応答$applyを行ってから$httpを防ぐことができますか?この場合、単純な火災と忘却の仕組みでは十分ではないでしょう。私はサーバーレスポンスについては気にしません。

私は間違っているのですか(またはループの原因を誤解しましたか)?これは基本的にカスタムexceptionHandlerのための角度文書からの基本例なので、私は非常に一般的な用途でこのクラッシュがなぜ発生するのか本当に混乱しています。

<div ng-bind="service.calculate()"></div> 

そして、それは、各ダイジェストサイクルを実行して、エラーを生成します。

+0

$ hhtを使用しない、xHtmlRequestを使用するJS –

+0

通話にAngularを使用しないでください。またはHTTPエラーをチェックしてエラーエンドポイントへの呼び出しでないことを確認してから別のエラーを送信しますか? – epascarello

+0

@epascarello私はあなたがそれによって何を意味するのか分かりません。エラーエンドポイントへの呼び出しが望まれるかどうかをどのように判断しますか? (通常、要求された動作が要求を送信しています!) –

答えて

0

はあなたのようなものを持っているように思えます。

htmlからの呼び出しを削除します。これは実際には良い練習です - 関数はイベントハンドラ(ng-click)、ng-if、ng-repeat、ng-showなどでのみadddressedする必要があります。 。

+0

これはループの原因となっている問題です。しかし、すべての 'ng-if'、' ng-repeat'などからこのような呼び出しを取り除くことを提案しても、私の場合はそうではありません。また、...我々は、アプリケーション内のすべての例外を処理するグローバルexceptionHandlerについてここで話しています。例外ハンドラを動作させるためにコードを再構築するのが快適ではない.... –

+0

これはexceptionHandlerに関するものではありません。これは、バグや悪影響を防ぐために書かれています。 –

関連する問題