2017-01-23 17 views
1

サービスから返されたObservablesが2つ(それぞれObservable.just()と考える)の1つしか返されません。それぞれが異なるタイプのものです(タイプが重要なので、タイプ・スクリプトで書いています)。Observablesを複数解決する方法

すべてのObservableが(約束の用語を使用して)解決されたかどうかを知る方法はありますか?失敗を個別に処理して実行する必要があります。

不自然な例:

const obs1 = someService.getThisThing(); //Observable<Type1> 
const obs2 = someService.getAnotherThing(); //Observable<Type2> 

const someObj = {}; 

obs1.subscribe(v1 => someObj.v1 = v1); 
obs2.subscribe(v2 => someObj.v2 = v2); 

// call someFunc(someObj), only when both above observables resolved to a value 
someFunc(someObj); 

Iはmergeを使用して試みたが、その後の値は任意の順序で来ることができるように、私は型の安全性を失い、そしてIであるかを決定するために.subscribeにその種類を検査する必要がどの

combinecombineLatesthereのように試しましたが、同時に両方が解決され、1が失敗するとすべてが失敗します。

答えて

4

個々のエラーを個別に処理できるようにする必要がある場合は、Observableにcatch()(または他の演算子)を追加する必要があります。 forkJoin()またはmerge()のような演算子は、いずれかのソースからエラーが送信されたときに常にエラー通知を送信します。 https://jsbin.com/hirodef/3/edit?js,console

二観察可能でcatch()でキャッチし、caught error文字列に置き換えられ、エラーがスローされます。

const Observable = Rx.Observable; 

let sources = [ 
    Observable.of(123).catch((err) => Observable.of('caught error')), 
    Observable.throw('error').catch((err) => Observable.of('caught error')) 
]; 

Observable.forkJoin(...sources) 
    .subscribe(values => console.log(values)); 

はライブデモを参照してください。コンソールに

このデモプリント:

[123, "caught error"] 
関連する問題