我必须并行执行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'。
这个解决方案远非优雅,但它有效..
任何想法如何让它变得更好?
谢谢!
答案 0 :(得分:2)
concat
对完成其他事情做一些事情非常有用。由于Observable
返回的calculatePayout
类型可能不同,因此您将空流转换为其结果类型:
obs1.mergeWith(obs2)
.ignoreElements()
.castAs(Payout.class)
.concatWith(payoutStrategy.calculatePayout(gameTemplate, gameData))
.subscribe( ...)
顺便说一下,如果obs1
和obs2
不是异步来源,那么您可以执行此操作以确保obs1
和obs2
并行运行:
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()
...