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

How to execute 2 Observables in parallel, ignoring their results and execute next Observable

我必须并行执行 2 个 observable(不关心它们的输出),当它们都完成时 -> 运行 另一个 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' 两次。

这个解决方案远谈不上优雅,但它确实有效..

有什么改进方法吗?

谢谢!

concat 对于在完成其他事情后做某事很有用。因为 calculatePayout 返回的 Observable 的类型可能不同,所以您将空流转换为其结果类型:

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()
    ...