RxJava Completable Concat - PullRequest
       8

RxJava Completable Concat

0 голосов
/ 11 мая 2018

Рассмотрим следующий фрагмент:

@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.

Очевидно, что два завершаемых набора выполняются параллельно, а не последовательно, как предполагалось.

Не могли бы вы объяснить, что я здесь не так делаю?

Заранее спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

CompletableFuture в значительной степени начинают выполняться сразу после объявления, что вы делаете completableTwoSeconds() способом, прежде чем RxJava и concat включаются. Вы должны отложить хотя бы второй вызов до completableTwoSeconds(), чтобы он выполнялся после завершения первого:

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