Rxjs完成后延迟对主题的订阅

时间:2019-09-26 10:19:27

标签: rxjs

我已创建此示例来演示该问题:https://stackblitz.com/edit/rxjs-vxvmq1?file=index.ts&devtoolsheight=100

基本上,我想在主题完成时调用一个函数(例如,示例中的cleanup)。该功能由其他人调用,因此不预订主题的更改,而是通过订阅来触发该功能以完成主题。该功能检查对象完成后是否应该做额外的工作,因此它检查对象是否已停止。但是,似乎一旦调用next(),就会在调用complete()之前触发该函数,从而使该函数认为主题尚未完成。

我想知道是否有任何方法可以解决这个问题?先完成呼叫complete(),然后再进行next(),这无济于事,因为在主题完成后,next()并没有通知订阅。

1 个答案:

答案 0 :(得分:1)

长话短说。都错了

修正#1,而不是rxjs-idiomatic:您订阅错误:在对onNext感兴趣的同时传递onComplete回调。 subscribe使用三个参数:onNext, onError, onComplete,您有责任选择自己真正需要的参数。

修复#2,rxjs-idiomaric:您必须将pipe(...)rxjs/operators(AFAIR)中定义的运算符一起使用。注意,定义自定义运算符也很容易。因此,您可以使用finalize(() => ...your cleanup logic goes here)Observable.create返回最终确定逻辑作为unsubscribe的实现。两者都很好地记录了herehere

此外,您似乎误解了rxjs的语义。就正则表达式而言,可以将其定义为next*(error|complete),其字面意思是:零个或无限多个next,后跟errorcomplete(排他或:从不两者同时进行)。因此,不要指望next(或相等地complete)被解雇后会做任何事情。