2017-01-23 5 views
1

Ich habe 2 (oder mehr) Observables von Diensten zurückgegeben, von denen jeder nur einen Wert zurückgibt (Think Observable.just()). Jeder von ihnen ist von unterschiedlichem Typ (ich schreibe in TypeScript, also Typen sind wichtig).So lösen Sie mehrere Observables

Gibt es eine Möglichkeit zu wissen, wann alle Observables entweder erfolgreich oder fehlgeschlagen gelöst haben (mit Versprechen Terminologie) Ich muss in der Lage sein, Fehler einzeln zu behandeln, und weitermachen.

konstruiertes Beispiel:

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); 

Ich habe versucht, merge verwenden, aber dann verliere ich Typsicherheit als Werte in beliebiger Reihenfolge kommen kann, und ich habe ihre Art zu inspizieren in .subscribe zu bestimmen, welche ist die

ich habe versucht, combine und combineLatest als here beschrieben - aber dann beide sie Entschlossenheit zugleich, und wenn 1 ausfällt - alles versagt

Antwort

4

Wenn Sie in der Lage sein müssen, jeden Fehler einzeln zu behandeln, müssen Sie jedem Observable catch() (oder vielleicht einen anderen Operator) hinzufügen. Operatoren wie forkJoin() oder merge() senden immer eine Fehlerbenachrichtigung, wenn eine ihrer Quellen einen Fehler sendet.

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)); 

Siehe Live-Demo: https://jsbin.com/hirodef/3/edit?js,console

Der zweite beobachtbare wirft einen Fehler, der mit catch() und ersetzt mit caught error String gefangen wird.

Diese Demo druckt zu trösten:

[123, "caught error"]