我必须并行执行 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 -> {
...
});
我使用合并只是为了调用 2 个 obs,然后使用“takeLast(1)”来忽略输入“flatMap”两次。
这个解决方案远非优雅,但它有效。
有什么想法可以让它变得更好吗?
Thanks!
concat
对于在完成某件事后做某事很有用。因为类型Observable
由返回calculatePayout
可能有所不同,您将空流转换为其结果类型:
obs1.mergeWith(obs2)
.ignoreElements()
.castAs(Payout.class)
.concatWith(payoutStrategy.calculatePayout(gameTemplate, gameData))
.subscribe( ...)
顺便说一句,如果obs1
and obs2
还不是异步源那么你可以这样做以确保obs1
and obs2
并行运行:
obs1.subscribeOn(scheduler).mergeWith(obs2.subscribeOn(scheduler))
...
取决于什么obs2
是在做scheduler
可能Schedulers.computation()
or Schedulers.io()
.
对于多个源可观察量,您也可以这样做:
Observable.just(obs1, obs2, .. , obsN)
.flatMap(o -> o.subscribeOn(Schedulers.computation())
.ignoreElements()
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)