2017-04-14 74 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#主题 –