尽管takeUntil,计时器的可观察性永远不会完成

时间:2017-08-30 14:40:05

标签: javascript rxjs rxjs5

我很痛苦地理解为什么我的观察结果永远不会完成。

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

  1. 主题isTimerEnabled$已初始化为false
  2. switchMap发出false时,返回Rx.Observable.never()的函数为isTimerEnabled$',否则映射到Rx.Observable.timer可观察
  3. 从计时器I take开始,持续1秒钟。
  4. 1秒后,观察完成
  5. 问题在于,当我订阅所有这些时,我的观察者的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次,然后就好了。(为了简单起见,我简化了我的代码片段)

    感谢您的时间:)

1 个答案:

答案 0 :(得分:1)

您可以使用 isTimerEnabled $ .complete(),这将完成您的Observable流。








 

  const isTimerEnabled $ = new Rx.Subject(false).switchMap(
 isTimerEnabled => ;
 isTimerEnabled
?Rx.Observable
 .timer(0,100)
 .timeInterval()&#xD ;
 .pluck('interval')
 .takeUntil(Rx.Observable.timer(1000))
:Rx.Observable.never()&# xD;
)

 isTimerEnabled $ .subscribe(
 console.log,
 console。错误,
()=> console.log('完成!')
)

 setTimeout (()=> isTimerEnabled $ .next(true),1000);
 setTimeout(()=> isTimerEnabled $ .complete(),5000);  


 < script src =“https://unpkg.com/rxjs/bundles/Rx.min.js”>< / script>  
&#的xD;

&#的xD;

&#的xD;