我有多个Singles在我的viewModel中返回三种类型。 假设他们返回TypeA,TypeB和TypeC。
我正在尝试实施以下方案:
启动TypeA->如果成功,则启动TypeB(以TypeA的结果作为参数),如果出错-下降到订阅的onError。
如果TypeB正确无误-只需订阅成功即可
如果TypeB失败,则启动TypeC(以TypeA的结果作为参数)
如果完成TypeC操作没有错误-只需订阅成功即可
如果TypeC失败,则记录“ Type C失败”,并下降到订阅的onError。
我尝试使用下面的代码实现这一逻辑(为简单起见,删除了线程切换方法):
// progress dialog impl removed for simplicity
viewModel.getTypeA().doOnSubscribe(v -> {
progressDialog.setMessage("Going for TypeA");
progressDialog.show();
})
.flatMap(typeA -> viewModel.getTypeB(typeA).doOnSubscribe(v ->
progressDialog.setMessage("Going for TypeB"))
.doOnSuccess(typeB -> progressDialog.setMessage("Operation is done: " + typeB.getOperation()))
.onErrorResumeNext(error -> viewModel.getTypeC(typeA))
.doOnSubscribe(v -> progressDialog.setMessage("TypeB failed, going for TypeC")))
.doFinally(() -> progressDialog.dismiss())
.subscribe(xType ->
{
/* if it's a result of typeB - log "type B success",
if it's a result of typeC - log "type C success" */
}
, error -> {/* log critical error we cannot handle */});
我希望在onSuccess订阅中使用typeB和typeC作为可能的参数,以便将它们都放在一个地方。
RxJava2中可以吗?
我不想从“父”类继承它们,因为实际上,typeB是服务器的响应,而typeC是将数据保存到数据库中的结果。
关于如何使用Rx实现这种逻辑的任何建议也都很好。