【问题标题】:RxJava2 chain commands with optional conditions带有可选条件的 RxJava2 链式命令
【发布时间】:2017-11-11 23:18:17
【问题描述】:

我仍在尝试了解响应式编程,并尝试使用 RxJava2 创建一个链。创建订单时的逻辑如下(伪代码)。

void createOrder {
    R r1 = null, r2 = null, r3 = null;
    Order order = null;
    if (condition1) {
        then r1 = new R();
    } else if (condition2) {
        then r2 = new R();
    }

    if (condition3) {
        then r3 = new R();
    }

    if (r1 not null) {
        if (r3 not null) {
            create order with r1 + r3
        } else {
            create order with r1
        }
    } else if (r2 not null) {
        if (r3 not null) {
            create order with r2 + r3
        } else {
            create order with r2
        }
    } else {
        fail creating an order
    }   
}

我已经创建了 4 个Singles 来完成创建 r1、r2、r3 和顺序的工作,但我不知道如何将所有这些链接在一起以按照上述逻辑构成整个序列。

我认为我们可以使用多个Maybes 进行if (condition) 检查,但不知道如何将它们与Singles 链接在一起以实现上述目的。

非常感谢您提供任何帮助。

【问题讨论】:

  • r1、r2、r3 是什么意思?您需要提供有关您正在尝试执行的操作的更多信息。
  • 它们是简单的 Java 对象。基本上,if 检查是基于创建对象 r1、r2、r3 的各种条件检查(如上所示)
  • r1、r2、r3的创建应该是异步的吗?
  • 可以,但需要在创建订单之前全部完成
  • 这看起来像 FizzBu​​zz 问题,但使用的是 RxJava。不要想太多。

标签: android rx-java rx-java2


【解决方案1】:

通过对逻辑进行一些重新排序,转换为反应链并不难。

您需要做的是观察可能的最终结果是什么以及达到这些结果的要求是什么:

  1. r1 或作为备份 r2 必须有一个值
  2. 如果r3有值,则与之前的结果合并
  3. 如果该值存在,则转成顺序。

点 1. 可以通过将每个变量视为 Maybe<R> 对象,然后使用 Maybe.switchIfEmpty 计算值来构造。

第 2 点可以使用第二个flatmap 实现来实现,它允许根据r3 的结果做出不同的反应。

第 3 点也可以在平面图中完成,使用 Single<Order> 完成它,如果上述步骤没有产生结果,则会引发错误。

这导致以下伪实现:

Maybe<R> r1 = Maybe.defer(() -> {
    if (condition1)
        return Maybe.just(new R());
    else 
        return Maybe.empty();
});

Maybe<R> r2 = Maybe.defer(() -> {
    if (condition2)
        return Maybe.just(new R());
    else 
        return Maybe.empty();
});

Maybe<R> r3 = Maybe.defer(() -> {
    if (condition3)
        return Maybe.just(new R());
    else 
        return Maybe.empty();
});

return r1.switchIfEmpty(r2).flatMap((r1r2) -> {
    return r3.flatMap(
        (r3val) -> Maybe.just(create order with r1r2 + r3val),
        (err) -> Maybe.error(err),
        () -> Maybe.just(create order with r1r2)
    );
}).switchIfEmpty(Single.defer(() -> {
    return Single.error(fail creating an order);
}));

这段代码的最终结果将是Single&lt;Order&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多