Что делает .defer () в RxJava? - PullRequest
0 голосов
/ 05 марта 2019

Я новичок в rx java, и я не могу понять, что приносит Completable.defer и почему это хорошая практика.

Итак, в чем разница:

public Completable someMethod1() {
    return Completable.defer(() -> someMethod2());
}

против

public Completable someMethod1() {
    return someMethod2();
}

Я вижу, что в реализации метода есть некоторая обработка исключений, но это превосходит меня. Цени это.

1 Ответ

1 голос
/ 05 марта 2019

Отсрочка гарантирует, что каждый подписчик может получить свою собственную исходную последовательность, независимую от других подписчиков. Позвольте мне проиллюстрировать это двумя примерами:

AtomicInteger index = new AtomicInteger();

Flowable<String> source =
    Flowable.just("a", "b", "c", "d", "e", "f")
    .map(v -> index.incrementAndGet() + "-" + v)
    ;

source.subscribe(System.out:println);

source.subscribe(System.out:println);

печать

1-a
2-b
3-c
4-d
5-e
6-f
7-a
8-b
9-c
10-d
11-e
12-f

против

Flowable<String> source =
    Flowable.defer(() -> {
        AtomicInteger index = new AtomicInteger();

        return Flowable.just("a", "b", "c", "d", "e", "f")
               .map(v -> index.incrementAndGet() + "-" + v)
               ;
    })
    ;

source.subscribe(System.out:println);

source.subscribe(System.out:println);

печать

1-a
2-b
3-c
4-d
5-e
6-f
1-a
2-b
3-c
4-d
5-e
6-f

Во втором примере существует состояние для каждого подписчика, которое в противном случае было бы разделено между всеми подписчиками. Теперь, поскольку каждый подписчик получает свою собственную индивидуальную последовательность, оба элемента индекса, как и следовало ожидать.

...