如何解析多个Observable

时间:2017-01-23 19:03:33

标签: javascript typescript rxjs rxjs5

我有两个(或更多)Observables从服务返回,每个Observable只返回一个值(想想Observable.just())。它们中的每一种都是不同的类型(我在TypeScript中写作因此类型很重要)。

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

人为的例子:

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中检查它们的类型以确定哪个是哪个

我已按照here所述尝试combinecombineLatest - 但他们同时解决了问题,如果1失败 - 一切都失败

1 个答案:

答案 0 :(得分:6)

如果您需要能够单独处理每个错误,那么您必须将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

第二个Observable抛出catch()捕获的错误,并替换为caught error字符串。

此演示打印到控制台:

[123, "caught error"]