可观察的计时器永远不会完成尽管takeUntil
问题描述:
我有很多痛苦的理解,为什么我的观察从未完成。可观察的计时器永远不会完成尽管takeUntil
我的代码应该是这样的工作:
- 初始化为false
- 主题
isTimerEnabled$
这是switchMap
倒是来,要么返回Rx.Observable.never()
时isTimerEnabled$
发出假的,否则它映射到一个功能Rx.Observable.timer
可观察 - 从计时器我
take
一切为1秒。 - 1秒后,可观测完成
的问题是,当我订阅了这一切,我的观察者的complete
方法不会被调用。
下面是代码,也许更有帮助:
const isTimerEnabled$ = new Rx.Subject(false).switchMap(
isTimerEnabled =>
isTimerEnabled
? Rx.Observable
.timer(0, 100)
.timeInterval()
.pluck('interval')
.takeUntil(Rx.Observable.timer(1000))
: Rx.Observable.never()
)
isTimerEnabled$.subscribe(
console.log,
console.error,
() => console.log('complete !')
)
所以,当我做的:
isTimerEnabled$.next(true)
它记录的10倍到控制台,然后..嗯,这是它(我简化了我代码片段的目的..好简单)
谢谢你的时间:)
答
你可以使用isTimerEnabled$.complete()
,这将完成您的Observable流。
const isTimerEnabled$ = new Rx.Subject(false).switchMap(
isTimerEnabled =>
isTimerEnabled
? Rx.Observable
.timer(0, 100)
.timeInterval()
.pluck('interval')
.takeUntil(Rx.Observable.timer(1000))
: Rx.Observable.never()
)
isTimerEnabled$.subscribe(
console.log,
console.error,
() => console.log('complete !')
)
setTimeout(() => isTimerEnabled$.next(true), 1000);
setTimeout(() => isTimerEnabled$.complete(), 5000);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
您好,感谢您的答复,你能说明一个小的代码片段? – Codii
@Codii当然,我已经用代码片段更新了答案。 –
也许我没有具体说明我希望我的Observable能够完成自己的事情,而不是强制要求完成这个主题。 – Codii