我有两个(或更多)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所述尝试combine
和combineLatest
- 但他们同时解决了问题,如果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"]