【问题标题】:Conditional operations in RxJava codeRxJava 代码中的条件操作
【发布时间】:2017-04-13 07:21:40
【问题描述】:

我是 RxJava 的新手,经常发现自己求助于以下解决方案来进行条件操作。这里我想按顺序链接两个调用,然后根据调用链的结果返回一个 int。是否有任何“rxified”方法来改进此代码? (在这里使用blockingSingle,因为我将生成的int 传递给一个遗留应用程序,我目前还不能将值推送到该应用程序)

return restApiAdapter.closePosition(request)
            .flatMap(dealReference -> restApiAdapter.getDealConfirmationObservable(dealReference.getValue())
                .map(dealConfirmationResponse -> {
                    if (dealConfirmationResponse.getDealStatus() == DealStatus.ACCEPTED) {
                        return SUCCESS.getValue();
                    } else {
                        return FAIL.getValue();
                    }
                })
            )
            .onErrorReturn(e -> ZorroReturnValues.BROKER_SELL_FAIL.getValue())
            .blockingSingle();

【问题讨论】:

  • 这里有很多不相关的代码,很难看到与您的问题相关的重要 RxJava 方面。你能大大简化一下吗?
  • 哇,这代码太棒了 :) - 检查 SOLID 原则和清洁代码指南。
  • 简化的例子,现在更清楚了吗? @andrei-macarie 这不是我想要的
  • 除了使用 ?: 或将 if/else 移动到一个命名合理的辅助方法之外,我想不出任何可以显着帮助代码的特定部分的东西。
  • 为了最大限度地使用 Rx 并增加代码的语义,如果可能的话,我建议分析哪些返回的状态会造成错误情况。然后,您可以从发出错误的 getDealConfirmationObservable() 可观察对象返回(例如:对于 ACCEPTED 以外的 DealStatus)。由于您的 API 的用户可以使用Rx error handling operators 来处理不同的情况(例如:忽略、重试、有条件的......),因此灵活性将会增加。

标签: java rx-java reactive-programming rx-java2


【解决方案1】:

按照@andrei-macarie 的建议移动逻辑以检查接受/拒绝订单后,代码现在看起来更像这样

return restApiAdapter.closePosition(request)
            .flatMap(dealReference -> restApiAdapter.getDealConfirmationObservable(dealReference.getValue())
                .map(dealConfirmationResponse -> SUCCESS.getValue()
            )
            .onErrorReturn(e -> FAIL.getValue())
            .blockingSingle();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 2011-05-30
    • 1970-01-01
    • 2018-02-23
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多