我已创建此示例来演示该问题:https://stackblitz.com/edit/rxjs-vxvmq1?file=index.ts&devtoolsheight=100
基本上,我想在主题完成时调用一个函数(例如,示例中的cleanup
)。该功能由其他人调用,因此不预订主题的更改,而是通过订阅来触发该功能以完成主题。该功能检查对象完成后是否应该做额外的工作,因此它检查对象是否已停止。但是,似乎一旦调用next()
,就会在调用complete()
之前触发该函数,从而使该函数认为主题尚未完成。
我想知道是否有任何方法可以解决这个问题?先完成呼叫complete()
,然后再进行next()
,这无济于事,因为在主题完成后,next()
并没有通知订阅。
答案 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
的实现。两者都很好地记录了here或here。
此外,您似乎误解了rxjs
的语义。就正则表达式而言,可以将其定义为next*(error|complete)
,其字面意思是:零个或无限多个next
,后跟error
或complete
(排他或:从不两者同时进行)。因此,不要指望next
(或相等地complete
)被解雇后会做任何事情。