我理解Observable数据服务的核心概念,但在需要更强大的服务时遇到了麻烦。
对于用户查询,我必须进行一系列http调用,以便首先查询用户对象,然后在获取用户对象后查询其他数据。由于这些额外的调用取决于抓取的用户对象。订阅者可以使用任何额外的数据接收整个用户对象。
我目前正在使用userSource.mergeMap(user => extraDataNeeded(user))
来返回组合的Observable。
extraDataNeeded
返回Observable.forkJoin(...OBSERVABLES)
的位置
OBSERVABLES
是一个http调用数组,用于向用户对象添加额外数据。
我的问题是,当其中一个额外的http调用失败时,链中的其余部分将被取消。我希望从userSource.mergeMap(user => extraDataNeeded(user))
创建的最高阶可观察量,如果一个失败,无论如何都可以进行所有http调用。我希望userSource.mergeMap(user => extraDataNeeded(user))
的订阅者能够接收到能够获取的任何数据的用户对象,以及任何内部http调用失败的任何错误。如果原始userSource
失败,则完全失败并且没有成功响应。
答案 0 :(得分:2)
您可以为每个catch
添加OBSERVABLES
块,以便失败响应只返回next
块中的错误正文。
即
source1.catch(e => Rx.Observable.of({error: e}));
source2.catch(e => Rx.Observable.of({error: e}));
//or made modular
function handler(e) { return Rx.Observable.of({error: e}));
var safeSource1 = source1.let(handler);
var safeSource2 = source2.let(handler);
然后在构建对象时,您只需要适当地处理这些错误:
Rx.Observable.forkJoin(safeSource1, safeSource2, sources => {
//Totally made up
var combined = {components: [], errors: []};
for (let resp of sources) {
if (resp.error)
combined.errors.push(resp.error);
else
combined.components.push(resp);
}
});
来自userSource
Observable
的错误仍会传递给错误处理程序并完全绕过forkJoin
。