【问题标题】:RxJava Completable ConcatRxJava Completable Concat
【发布时间】:2018-05-11 10:13:19
【问题描述】:

考虑以下sn-p:

@Test
public void completableConcatTest() {
    Completable.concat(completableTwoSeconds(), completableTwoSeconds())
            .doOnCompleted(() -> System.out.println("Both completed."))
            .await();
}

private Completable completableTwoSeconds() {
    PublishSubject<Void> subject = PublishSubject.create();

    CompletableFuture.supplyAsync(() -> {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        subject.onCompleted();
        return null;
    });

    return subject.doOnCompleted(() -> System.out.println("I'm completed." + Instant.now())).toCompletable();
}

运行时,测试产生以下输出:

I'm completed.2018-05-11T10:07:26.359Z
I'm completed.2018-05-11T10:07:26.380Z
Both completed.

显然,两个可完成程序并行运行,而不是按预期顺序运行。

你能解释一下我在这里做错了什么吗?

提前致谢!

【问题讨论】:

    标签: java rx-java


    【解决方案1】:

    CompletableFutures 几乎在声明后立即开始执行,您在 RxJava 和 concat 参与之前以 completableTwoSeconds() 方式执行此操作。您必须至少推迟对 completableTwoSeconds() 的第二次调用,以便在第一次调用完成后执行:

    Completable.concat(
        completableTwoSeconds(), 
        Completable.defer(() -> completableTwoSeconds())
    )
    .doOnCompleted(() -> System.out.println("Both completed."))
    .await();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多