2017-06-06 36 views
0

我創建這個訂閱,創建另一個訂閱:RxJava2:認購沒有達到

this.loggingInterval$ 
    .filter(interval -> interval > 0) 
    .doAfterNext(
     interval -> 
     { 
      Observable.interval(interval, TimeUnit.SECONDS) 
       .doOnNext(t -> this.readAdditionalConfigurationFile()) 
       .doOnError(t -> LoggerFactory.getLogger(this.getClass()).error(t.toString())) 
       .takeUntil(this.destroy$) 
       .subscribe(); 
     } 
    ) 
    .takeUntil(this.destroy$) 
    .subscribe(); 

所以,每次interval的變化,它是大於0我建一個訂閱閱讀配置文件中的每個新interval秒。它在destroy$排放true時被破壞。

問題是interval.doOnNext()永遠不會到達。

this.destroy$ = BehaviorSubject.createDefault(false); 
this.loggingInterval$ = BehaviorSubject.createDefault(10); 

任何想法?

回答

1

這是一個反模式,在observable內創建一個訂閱;有很多簡單的方法來做到這一點。

this 
.loggingInterval$ 
.filter(interval -> interval > 0) 
.distinctUntilChanged() 
.switchMap(interval -> Observable.interval(interval, TimeUnit.SECONDS, Schedulers.io())) 
.doOnNext(dummy -> this.readAdditionalConfigurationFile()) 
.doOnError(t -> LoggerFactory.getLogger(this.getClass()).error(t.toString())) 
.takeUntil(this.destroy$) 
.subscribe(); 

上面也有終止的整個產業鏈,如果認購被退訂的好處(這是你破壞了什麼$是應該做的,對吧?)。

+0

是啊!它看起來非常好!儘管如此,我還要評論另一件事。我編輯了這篇文章。 – Jordi

+0

因此,記錄間隔的'BehaviorSubject <>'實際上是改變f.e的值的「正確」方法。通過JMX暴露。但'destroy $'有點臭,你可以用plaing'private boolean destroy'替換它,只是'.takeUntil(dummy - > destroy)' - 或者只是退訂訂閱。 –