RXJS - 可观察链中的错误处理

时间:2017-09-15 12:32:47

标签: angular rxjs

我刚刚学会了不要嵌套订阅,所以我使用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上的错误方法?

  • 我还没有想出如何在发生错误时立即停止事件链 - 我该怎么做?

感谢您的帮助!

1 个答案:

答案 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))