2016-04-08 3 views
9

私はAPIサーバーとやりとりするサービスを持っています。 myHttpPost(data)メソッドがあります。このメソッドべき:Angular2では、observableからのエラーレスポンスをインターセプトしてエラーチャンネルに渡す方法

  1. コールサーバへの角度のhttp.post
  2. 応答は、ステータス200を持っている場合、応答が異なるステータス、プロセス応答を有する場合
  3. を加入者応答のJSONコンテンツを提供し、処理エラーを提供
  4. 加入者へ

私の方法の現在のバージョンは次のとおりです。

postData(path: string, data: Object): Rx.Observable<any> { 
    let json = JSON.stringify(data); 
    return this.http.post(path, json) 
     .map(res => res.json()) 
} 

mapは成功時にのみ呼び出され、エラー時ではないので、これは上記のリストからポイント3を実行していません。私は追加することにより、順序を変更することができます:「終了し、観察シーケンスを継続します:

.catch(error => { 
    let myError = prepareErrorContent(error); 
    return Rx.Observable.throw(myError); 
}); 

を次に加入者(他のサービス)がmyError(それは大丈夫だ)が、rxjsのドキュメントはキャッチについては、次の()メソッドは言う受け取ります次の観測可能なシーケンスとの例外によって。しかし、私はシーケンスが正常に終了し、続行しないようにします。上記のようなcatch()を使用すると、サブスクライバからのpostData()の次の呼び出しが機能しません(httpコールを行う代わりに、同じエラーがすぐに返されます)。私はシーケンスが終了していないためだと思う。

どうすればよいですか?実際に

this.jsonHttp.postData(path, data) 
    .subscribe(
     struct => onNext(struct), 
     error => { 
      let message = this.jsonHttp.extractError(error); 
      onError(message) 
     }, 
     () => onComplete ? onComplete() : null 
    ); 
+0

どのように 'postData'メソッドを呼び出しますか?ありがとう! –

+0

私の記事の更新をご覧ください。 – camcam

答えて

16

、処理チェーンが作成され、実行される各HTTP要求のために:

[編集] これは、このサービスを使用し、私の加入方法です。応答が受信されると(成功してもエラーでも)、チェーンは完了する。

要求を2回実行すると、要求が2回実行された場合、それらの間にリンクはありません。両方の要求が同じ処理チェーンの一部である場合、いくつかのリンクを持つことができます。例えば、flatMapまたはswitchMapのような観測可能な演算子を使用する場合。ここで、サンプルである:

return this.http.get(...) 
     .map(res => res.json()) 
     .flatMap(jsonData => { 
      // Can leverage the result of the previous request 
      return this.http.get(...).map(res => res.json()); 
     }); 

エラーが発生した場合、処理チェーンが壊れているとcatchオペレータが呼び出されます。関連付けられたコールバック内のオブザーバブルを返すことで、処理チェーンを継続することができます。これは、古典的な観察可能なもの、またはObservable.throwのものです。 Angular2のHTTPリクエストのコンテキストでは、2xxとは異なるステータスコードを持つ応答はエラーとみなされます。

Observable.throwを返すと、サブスクライブ時に指定された2番目のコールバックが呼び出されます。別の観測可能な場合は、最初のコールバックが呼び出されます。例えば:

return this.http.get(...) 
     .map(res => res.json()) 
     .catch(res => { 
      // The error callback (second parameter) is called 
      return Observable.throw(res.json()); 
      // The success callback (first parameter) is called 
      // return Observable.of(res.json()); 
     }); 

Iは、認証ヘッダなし(ボタンをクリックする)要求を実行plunkrを実現するので、401のステータスコードが受信されます。もう一度クリックすると、ヘッダーが追加されるため、200のステータスコードが受信されます。 2つのリクエストの間には関係がないことを示すだけです。

このplunkr:https://plnkr.co/edit/5WwWpwjvQmJ4AlncKVio?p=previewを参照してください。

+0

あなたは正しいです。私はキャッチで前のバージョンに私のアプリケーションコードを戻しました、そして、今働いています。私は本当になぜそれが以前にはうまくいかなかったのか分かりませんし、そのエラーを複製します。御時間ありがとうございます。 – camcam

関連する問題