javascript - 尽管有 takeUntil,定时器的 Observable 永远不会完成

标签 javascript rxjs rxjs5

我很难理解为什么我的 Observable 永远不会完成。

我的代码应该像这样工作:

  1. 主题 isTimerEnabled$ 初始化为 false
  2. 它是 switchMap 的函数,当 isTimerEnabled$ 发出 false 时返回 Rx.Observable.never(),否则它映射到一个 Rx.Observable.timer observable
  3. 根据计时器,我采取所有内容 1 秒。
  4. 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/

相关文章:

javascript - 没有订阅者时如何暂停 shareReplay

angular - 我如何从 RXJS 5.5.6 模拟 fromEvent 函数?

rxjs - 重复请求直到满足条件并返回中间值

javascript - AJAX 请求第一次不起作用,但此后可以起作用

javascript - 为什么将内容插入选项卡后连接线会消失?

javascript - 无法列出 'third-party/glog-0.3.4/test-driver' 的内容。无法跟踪符号链接(symbolic link)

rxjs - Subject 类的 isStopped 和 closed 属性有什么区别?

angular - 使用 Angular2/RxJS 读取缓冲响应

angular - 使用计时器时如何刷新 Angular HTTP 调用?

javascript - URL 正则表达式在 javascript 中不起作用