2017-04-14 75 views
-2

我想弄清楚按順序組合不同類型的observables然後比較結果的最佳方法。看着zip和combineLatest,我不認爲他們是合適的。我怎樣才能做到以下幾點?RxJava結合observables並與以前的值進行比較

@Test 
    public void shouldInsertRecord(){ 



     BidsEntity bid = new BidsEntity(/* omitted */); 


     Observable<Integer> count1 = bidsRepository.getBid(bid.getUserId(), bid.getListingId()).count(); 

     Observable<Boolean> insert = bidsRepository.insertBid(bid); 

     Observable<Integer> count2 = bidsRepository.getBid(bid.getUserId(), bid.getListingId()).count(); 


     //run count1, run insert, run count2 in that order 
     //assert that count2 is greater than count1 

    } 
+0

你的代碼有很多不相關的東西。由於組合的結果,您期望的順序也不清楚。相反,您可以簡單地提供輸入序列示例和預期的組合輸出序列。 – yurgis

+0

嗨@yurgis,我不知道什麼是不相關的 - 我試圖做三個操作,並比較操作1和操作3的結果。 –

+0

好吧,我只是注意到你似乎運行單元測試而不是生產代碼。在這種情況下,你只需要將Blocking()。singleOrDefault()應用到所有3個可觀察對象。在測試代​​碼中使用阻塞是完全正確的。另一個選項是在異步調用之前將CountDownLatch設置爲3,在onNext中爲所有3個可觀察對象調用countDown,並捕獲AtomicIntegers和AtomicBoolean中的值。異步調用後,有latch.await()將阻塞,直到所有值到達你的原子變量。 – yurgis

回答

0

不是順序的(又名阻塞)是ReactiveX的一點。

看看你的例子,我認爲只要插入一個投標就會有一個觀察值發出數值是合理的。然後你訂閱那個觀察者,並在單個觀察者中做任何你想要處理的信息。

您已經有了一個適合它的設置。使bidsRepository.getBid(...)返回添加新投標時發出的觀察值,並用單個觀察者替換count變量。

+0

你是正確的,非阻塞是重點,但必須有某種方式來保證這樣的測試順序。我不知道如何在添加新出價時讓Repo發佈,因爲這主要是sql上的shell。我會考慮的。 –

+0

我顯然不知道你的回購的具體情況,但主題可能是你想看的東西:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%201%20- %20Getting%20Started/2%20Key%20types.md#主題 –