2017-08-30 21 views
3

我有一個BehaviorSubject,我想重置 - 我的意思是我希望最新的值不可用,就像它剛剛創建。如何重置行爲主題

我似乎沒有看到一個API來做到這一點,但我想有另一種方法來實現相同的結果?

我希望的行爲是我需要發出事件,並且我希望訂閱者在訂閱時獲取最新的事件 - 如果特定的經理處於「已啓動」狀態。但是,當這位經理「停止」時,最新的活動應該不可用(就像從未開始的那樣)。

+0

隨着一個BehaviorSubject有一個剛剛創建時的下一個值,這就是它的全部要點(以及爲什麼在創建時需要提供該值)。 – jonrsharpe

+0

@jonrsharpe但是當你創建它時你不需要提供它! http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/subjects/BehaviorSubject.html#create-- – BoD

+0

奇怪的是,它並沒有在RxJS版本中(https://github.com) /Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md) - 如果你不想提供初始值,爲什麼不用'ReplaySubject'代替? – jonrsharpe

回答

4

我假設你想清除BehaviorSubject(因爲否則不要調用onComplete就可以了)。不支持,但你可以通過具有被消費者忽略的電流值達到類似的效果:

public static final Object EMPTY = new Object(); 

BehaviorSubject<Object> subject = BehaviorSubject.createDefault(EMPTY); 

Observable<YourType> obs = subject.filter(v -> v != EMTPY).cast(YourType.class); 

obs.subscribe(System.out::println); 

// send normal data 
subject.onNext(1); 
subject.onNext(2); 

// clear the subject 
subject.onNext(EMPTY); 

// this should not print anything 
obs.subscribe(System.out::println); 
+0

非常感謝!這就是訣竅。 – BoD

2

開關可觀察到的上的價值和關閉的另一種方法是使用switchMap()實際之間翻轉可觀察的和空的。

讓我們假設你有一個管理器對象,並且它有一個顯示其狀態的可觀察對象。然後,當manager處於ON狀態

subjectObservable = manager.getStateObservable() 
    .switchMap(state -> state == ON ? subject : Observable.never()); 

將僅發射值。

+0

有趣!謝謝。 – BoD

0

我找出某些情況下,更好更好的解決方案是:subject.skiplast(1)它可以工作到「潔淨」流的最後一個位置正在被保留,因爲的BehaviorSubject「行爲」