Rxjava:如何在没有完成所有可观察的情况下组合多个可观察对象?

时间:2018-01-10 22:55:59

标签: java rx-java reactive-programming rx-java2

我有多个热门观察者可能会或可能不会发出物品。因此,我希望组合observable,然后处理结果,如果它们中的任何一个发出结果,但如果其他observable发出项目,它们应该一起处理。

例如

observable1 = PublishSubject<>()  
observable2 = PublishSubject<>()

observable1.onNext(1)  
observable1.onNext(2)  
observable2.onNext("Test")  
observable1.onNext(3)

应该发出:

(1, null) 
(2, null)
(2, "Test")
(3, "Test")

observable2

之前observable1也可能会发出jQuery.serialize()

CombineLatest最接近我的需要,但只有在所有可观察者发出至少一个项目时才会发出结果。是否有反应操作员?

1 个答案:

答案 0 :(得分:2)

您可以对每个源使用BehaviorSubject来提供初始值,或者使用带有初始值的combineLatest,然后对这些增强的Observable应用null。但是,在RxJava 2中不允许PublishSubject<Integer> observable1 = PublishSubject.create() PublishSubject<String> observable2 = PublishSubject.create() Observable.combineLates( observable1.startWith(-100000), observable2.startWith(""), (a, b) -> a + b ) .subscribe(System.out::println) ; observable1.onNext(1) observable1.onNext(2) observable2.onNext("Test") observable1.onNext(3) ,因此您必须在可观察元素类型中找到中性值。

BehaviorSubject<Integer> observable1 = BehaviorSubject.createDefault(-10000)  
BehaviorSubject<String>  observable2 = BehaviorSubject.createDefault("")

Observable.combineLates(
    observable1,
    observable2,
    (a, b) -> a + b
)
.subscribe(System.out::println)
;

observable1.onNext(1)  
observable1.onNext(2)  
observable2.onNext("Test")  
observable1.onNext(3)

<button id="ButtonCalc" label="Re-Calculate" size="large" onAction="calc" image="Calculate" getEnabled="disableRefresh"/>