2017-09-15 54 views
1

链中的错误处理我刚刚学会了不要窝订阅,所以不是我使用switchMapTo为起始完成上一步骤中的每一步后续的手段:RXJS - 在观测

例如

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?还是我可以在一个地方管理它?

  • 有什么用途return Observable.of([]);服务 - 我从这里调用我的outerStream上的错误方法?

  • 我还没有想出如何一旦发生错误就停止事件链 - 我该怎么做?

感谢您的任何帮助!

+0

我写了一个答案,但我对你有一个额外的问题。从哪里得到'someResults'以及'switchMapTo'运算符中的函数返回的是什么。 – M4R1KU

回答

1

首先,您应该将运算符链接到可观察值上,而不是在每次调用switchMapTo时创建新常量。然后你得到这个。

this.retrieveAnnualLeaveVariables() 
    .switchMapTo(this.initialise()) 
    .switchMapTo(this.retrieveData()) 
    .switchMapTo(this.accumulateAnnualLeaveRecords()) 
    .subscribe(() => outerStream.next(someResults)) 

然后,如果你有这个你可以在认购前添加catch。 在catch中,您可以返回一个新的“后备”值作为可观察值,一个空的可观察值或抛出另一个错误。

如果你想停止链,那么你应该通过Observable.empty()返回一个空的Observable。如果你返回这个,Observable将完成而不调用给定的订阅功能。

结果:

this.retrieveAnnualLeaveVariables() 
    .switchMapTo(this.initialise()) 
    .switchMapTo(this.retrieveData()) 
    .switchMapTo(this.accumulateAnnualLeaveRecords()) 
    .catch(() => Observable.empty()) 
    .subscribe(() => outerStream.next(someResults)) 
+0

谢谢@ M4R1KU - 非常感谢!我会尝试一下,并更新帖子。 –

+0

我已采纳您的建议,以避免多个常量 - 谢谢。 我一直在测试这个,在我看来,switchMapTo不等待它的前任完成,而switchMap - 我需要代码运行一个步骤,完成,然后继续下一步,所以我想我会要求switchMap 我已经成功地报告了错误 - 谢谢。 非常感谢您的回复时间。 –