我刚刚学会了不要嵌套订阅,所以我使用switchMapTo作为在上一步完成时开始每个连续步骤的方法:
e.g。
const s1$ = this.retrieveAnnualLeaveVariables();
const s2$ = s1$.switchMapTo(this.initialise());
const s3$ = s2$.switchMapTo(this.retrieveData());
const s4$ = s3$.switchMapTo(this.accumulateAnnualLeaveRecords());
s4$.subscribe(() => outerStream.next(someResults) ) // pass the results to the outerStream
我现在不清楚的是如何以简洁的方式集成错误处理,以便我可以在发生错误信号时向 outerStream 发送错误信号问题,在链中的任何地方遇到。
我尝试将以下内容附加到第一个
.catch(e => {
return Observable.of<any>([]);
});
然而:
我应该将它附加到每个 switchMapTo 吗?或者我可以在一个地方管理它吗?
返回Observable.of([]); 的目的是什么?我是否从此处调用我的outerStream上的错误方法?
我还没有想出如何在发生错误时立即停止事件链 - 我该怎么做?
感谢您的帮助!
答案 0 :(得分:1)
首先,你应该在你的observable上链接运算符,而不是每次调用switchMapTo
时创建一个新的常量。然后你就明白了。
this.retrieveAnnualLeaveVariables()
.switchMapTo(this.initialise())
.switchMapTo(this.retrieveData())
.switchMapTo(this.accumulateAnnualLeaveRecords())
.subscribe(() => outerStream.next(someResults))
然后,如果你有这个,你可以在订阅之前添加catch
。
在catch
中,您可以返回一个新的“fallback”值作为observable,一个空的observable或抛出另一个错误。
如果你想要停止链,那么你应该通过Observable.empty()
返回一个空的Observable。如果你返回这个,Observable将完成而不调用给定的订阅函数。
结果:
this.retrieveAnnualLeaveVariables()
.switchMapTo(this.initialise())
.switchMapTo(this.retrieveData())
.switchMapTo(this.accumulateAnnualLeaveRecords())
.catch(() => Observable.empty())
.subscribe(() => outerStream.next(someResults))