如何并行执行2个Observable,忽略它们的结果并执行下一个Observable

时间:2015-07-24 17:56:03

标签: java rx-java

我必须并行执行2个observable(不关心它们的输出),当它们都完成时 - >运行另一个可观察的。

这是我的解决方案,但我觉得有更好的解决方案:

rx.Observable<GameObject> obs1 = ...;
rx.Observable<GameObject> obs2 = ...;

rx.Observable.merge(obs1,obs2).takeLast(1)
.flatMap(mergeObj -> {

    return payoutStrategy.calculatePayout(gameTemplate, gameData);
}).subscribe(results -> { 
...
});

我使用merge只是为了调用2个obs,然后'takeLast(1)'忽略两次输入'flatMap'。

这个解决方案远非优雅,但它有效..

任何想法如何让它变得更好?

谢谢!

1 个答案:

答案 0 :(得分:2)

concat对完成其他事情做一些事情非常有用。由于Observable返回的calculatePayout类型可能不同,因此您将空流转换为其结果类型:

obs1.mergeWith(obs2)
    .ignoreElements()
    .castAs(Payout.class)
    .concatWith(payoutStrategy.calculatePayout(gameTemplate, gameData))
    .subscribe( ...)

顺便说一下,如果obs1obs2不是异步来源,那么您可以执行此操作以确保obs1obs2并行运行:

obs1.subscribeOn(scheduler).mergeWith(obs2.subscribeOn(scheduler))
    ...

取决于obs2正在做什么scheduler可能是Schedulers.computation()Schedulers.io()

对于多个源可观察对象,您也可以这样做:

Observable.just(obs1, obs2, .. , obsN)
    .flatMap(o -> o.subscribeOn(Schedulers.computation())
    .ignoreElements()
    ...