2017-08-17 10 views
3

サーバーが無効な応答を返すまで、正常に動作しているサービスでAngular 2のHTTPメソッドを使用しようとしています。ここに私のサービスからのメソッドのコードは次のとおりです。RxJS購読エラーハンドラが起動しないのはなぜですか?

サーバーが無効な応答を返す
getCalcCode(request: CalculatorRequest) { 
    this.http.post(this._serviceUrl, JSON.stringify(request), this.options) 
    .map((response: Response) => response.json().returnData as CalculatorResponse) 
    .catch((error) => { 
     return Observable.throw(error); 
    }) 
    .subscribe((response: CalculatorResponse) => { 
     if (response.returnCode === '000') { 
     console.log('Code is zero!'); 
     } 
    }, (error) => { 
     console.error('Error: : ', error); 
    }); 
} 

Mapオペレータは返す私の購読方法の中からresponse.returnCodeにアクセスしようとすると、未定義のため、私が受け取る:

ERROR TypeError: Cannot read property 'returnCode' of undefined

そして、非同期コードは単に実行を停止します...サブスクリプションのエラー関数は呼び出されません(EDIT:サーバーが正しく応答し、マッピングが正しく機能しているため、間違ったJSON形式)。

サブスクリプション内のエラーがエラーハンドラから取り込まれるようにするにはどうすればよいですか?

ありがとうございます!

EDIT

さらなるコメントでこれを議論した後、私は本当にここに求めていることは、私の「購読」コールバック内からエラーをキャッチする方法を正確に? try/catchブロックを使うだけでいいですか?

+0

サーバーはHTTPエラーコード(つまり> 200)を返しますか? –

+1

あなたはすでにすべてを考え出しているようです。成功コールバックが実行されるため、エラーコールバックは実行されません。どちらか一方であり、両方ではありません。 map()コールバック、成功コールバック、バックエンドのバグが修正されているようです。 –

+0

確かに、サーバーは実際には不正なJSONだけでステータスコード200で応答しています。 – slashp

答えて

1

コメント内の説明は、実際には少し正確ではありません。ソースからエラーが発生すると、map()オペレータへのコールバックは呼び出されず、エラーはただちに送信されます(map()nextシグナルでのみ動作し、errorでは動作しません)。 「どちらか一方、決して両方の」ルールは、errorcompleteシグナルにのみ適用され、nextシグナルには適用されません。もちろん、nextシグナルを複数持つこともできます。

その後、それはcatch()によって捕捉され、ちょうど再スローされます。

  1. この場合、catch()を使用する必要はありません。エラーは既に通知としてerrorとして伝播されます。

  2. サーバが適切なステータスコードを送信しない可能性があるため、Angular HTTPサービスは、これらのメッセージをnextの通知として解釈します。サーバーが例えば404または500ステータスコードを送信すると、自動的にエラーとして伝播され、何もする必要はありません。

+0

これは私の質問と私が持っていた別の質問に完全に答えました。私は、エラーがサブスクライブイベントハンドラに渡されるかどうかのように、 "catch()"演算子を使用する必要があるかどうか不思議でした。ありがとうございました!! – slashp

+1

@ martin多分あなたは私が言ったことを誤解していたかもしれません、あるいは私は自分自身を正しく表現していませんでした。エラーが発生し、subscribeメソッドのエラーコールバックが呼び出されるか、またはそれが通常のイベントであり、susbscribeメソッドの成功コールバックが呼び出されます。両方とも同じイベントのために呼び出すことはできません。ここで放出されるイベントは1つあり、OPはコールされる成功とエラーの両方のコールバックを期待していました。それは起こり得ない。 –

関連する問題