如何并行执行 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( ...)
顺便说一下,如果 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()
...
我必须并行执行 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( ...)
顺便说一下,如果 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()
...