2017-09-01 6 views
2

を使用して、ルータのparamMapとサブスクリプションを失う - 以下参照:角度4、私は非常に小さく、簡単なアプリケーションを持っている角度の最新バージョンを使用してswitchMap

simple app

を予測詳細コンポーネントは、次のようになります。

public getForecastData(forecastId) : Observable<any> { 
    return this.http.get<any>('/api/forecasts/' + forecastId + '/data'); 
} 

ngOnInit() { 
    this.route.paramMap 
    .switchMap(
     params => { 
     return this.getForecastData(params.get('id')) 
     }) 
}) 
.subscribe((data) => { 
    // business logic here 
}); 

私が抱えている問題は、getForecastData呼び出しが失敗した場合(サーバーが500を返す)、ルータのparamMap observableへのサブスクリプションが失われているようです。別の予測に移動しようとしましたが、getForecastDataメソッドは呼び出されません。

私は何らかのエラー処理が必要だと思っていますが、どこでこれを処理する必要がありますか?サブスクライブの中でエラーコールを追加することは、別のObservableを返す必要がなければ機能していないようです。

これは基本的にAngularサイトのチュートリアルからの適応ですが、静的なデータを持つPromiseを返信し、幸せな道にはまっています。

+0

'データ=> {//ここにビジネスロジック})、エラーで再びこれを使用する場合=> //あなたのERROR' errがngOnItをお勧めします> >関数呼び出し>>エラー>>再び機能する – Swoox

答えて

1

エラーが発生して、unsubscribeをアップストリームに通知し、ダウンストリームでエラーを伝播します。だから、あなたのgetForecastData()呼び出しがエラーを返すと、これはあなたのsubscribeに送られ、上流の購読を取り消します。これがあなたの外側ストリーム(switchMap)が停止する理由です。

getForecastDataがエラーをスローした場合でもストリームを継続したい場合は、キャッチして通常の値を返す必要があります。例えば:

this.route.paramMap 
.switchMap((params) => { 
    return this.getForecastData(params.get('id') 
    .do(null, err => console.log('getForecastData error: ' + err.message)) 
    .catch(_ => Rx.Observable.empty()); 
}) 
.subscribe(); 

In this talk by Ben Lesh errors & handling them is explained in detail.

関連する問題