2017-01-23 76 views
1

我有2个(或更多)从服务返回的观察对象,他们每个人只返回一个值(想想Observable.just())。他们每个人都是不同的类型(我正在写TypeScript,所以类型很重要)。如何解决多个观察对象

有没有办法知道所有Observables何时解决(使用Promise术语)成功或失败,我需要能够单独处理失败,并继续。

人为的例子:

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

我已经使用merge尝试,但然后我松类型安全性值可能会在任何顺序,我必须检查其类型在.subscribe,以确定哪个是哪个

我试过combinecombineLatest,如here所述 - 但之后它们都在同一时间解析,如果1失败 - 一切都失败

回答

4

如果您需要单独处理每个错误,那么您必须将catch()(或者其他某个运算符)附加到每个Observable。当其任何源发送错误时,运营商(例如forkJoin()merge())始终会发送错误通知。

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

见现场演示:https://jsbin.com/hirodef/3/edit?js,console

第二个可观测抛出被抓到catch()caught error字符串替换错误。

该演示打印到控制台:

[123, "caught error"]