我很难理解为什么我的 Observable 永远不会完成。
我的代码应该像这样工作:
- 主题
isTimerEnabled$
初始化为 false - 它是
switchMap
的函数,当isTimerEnabled$
发出 false 时返回Rx.Observable.never()
,否则它映射到一个Rx.Observable.timer
observable - 根据计时器,我
采取
所有内容 1 秒。 - 1 秒后,observable 完成
问题是,当我订阅所有这些时,我的观察者的 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>
关于javascript - 尽管有 takeUntil,定时器的 Observable 永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963350/