2017-11-15 19 views
5

アプリケーションの1つをAngular 5にアップグレードし、rxjs v5.5で導入されたlettable operatorsへの移行を開始しました。lettable rxjs演算子の結合パイプでのキャッチエラー

このため、観測可能パイプラインを.pipe()演算子を持つ新しい構文に書き直しました。

私たちの前のコードは、.catch().switchMap()の中にあり、エラーがスローされた場合にエフェクトの実行を中断しないようにしています。 dataServiceへの呼び出しでスローされたエラーの場合は

@Effect() 
loadData$ = this.actions$ 
.ofType(LOAD_DATA) 
.map((action: LoadData) => action.payload) 
.withLatestFrom(this.store.select(getCultureCode)) 
.switchMap(([payload, cultureCode]) => this.dataService.loadData(payload, cultureCode) 
    .map(result => { 
    if (!result) { 
     return new LoadDataFailed('Could not fetch data!'); 
    } else { 
     return new LoadDataSuccessful(result); 
    } 
    }) 
    .catch((err, caught) => { 
    return Observable.empty(); 
    }); 
); 

それがキャッチされ処理(ここでエラー処理を簡素化)されるだろう。 .pipe()の新しい構文と使用して

、我々は今、この

@Effect() 
loadData$ = this.actions$ 
.ofType(LOAD_DATA) 
.pipe(
    map((action: LoadData) => action.payload), 
    withLatestFrom(this.store.select(getCultureCode)), 
    switchMap(([payload, cultureCode]) => this.dataService.loadData(payload, cultureCode)), 
    map(result => { 
    if (!result) { 
     return new LoadDataFailed('Could not fetch data!'); 
    } else { 
     return new LoadDataSuccessful(result); 
    } 
    }) 
); 

は、どのように私は、同様の方法で新しい構文を使用して、観察可能なパイプライン内の任意のスローエラーをキャッチすることができますか?

+0

ので、任意のエラーは、外側ストリームを閉じます。次のようなものがあります: 'switchMap(([payload、cultureCode])=> this.dataService.loadData(payload、cultureCode).pipe(map ...、catch ...))' –

+1

素晴らしい作品@arturgrzesiak!それを回答として投稿し、私はそれを受け入れるでしょう! :) –

答えて

5

リファクタリングの後にmapswitchMapから移動したため、エラーが発生すると外部ストリームが閉じられます。両方のストリームと同等を維持するには、そのような投影自体にpipeを使用する必要があります:あなたは `` switchMap`投影のうちmap`を移動リファクタリング後

@Effect() 
loadData$ = this.actions$ 
.ofType(LOAD_DATA) 
.pipe(
    map((action: LoadData) => action.payload), 
    withLatestFrom(this.store.select(getCultureCode)), 
    switchMap(([payload, cultureCode]) => 
    this.dataService.loadData(payload, cultureCode) 
     .pipe(
     map(result => { 
      if (!result) { 
      return new LoadDataFailed('Could not fetch data!'); 
      } else { 
      return new LoadDataSuccessful(result); 
      } 
      }), 
     catchError((err, caught) => { 
      return Observable.empty(); 
     }) 
    ) 
) 
); 
+1

これは私が意図した通りに動作しますが、 'catch'は' catchError'に改名されました!ありがとう! –

+1

ありがとうございます - 'catch'は予約済みのキーワードです –

関連する問題