2017-08-30 72 views
1

我有很多痛苦的理解,为什么我的观察从未完成。可观察的计时器永远不会完成尽管takeUntil

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

  1. 初始化为false
  2. 主题isTimerEnabled$这是switchMap倒是来,要么返回Rx.Observable.never()isTimerEnabled$发出假的,否则它映射到一个功能Rx.Observable.timer可观察
  3. 从计时器我take一切为1秒。
  4. 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倍到控制台,然后..嗯,这是它(我简化了我代码片段的目的..好简单)

谢谢你的时间:)

回答

1

你可以使用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>

+0

您好,感谢您的答复,你能说明一个小的代码片段? – Codii

+0

@Codii当然,我已经用代码片段更新了答案。 –

+0

也许我没有具体说明我希望我的Observable能够完成自己的事情,而不是强制要求完成这个主题。 – Codii