2017-08-30 37 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