.defer()在RxJava中做什么?

时间:2019-03-05 16:20:55

标签: rx-java

我是rx java的新手,我无法理解Completable.defer带来的好处以及为什么使用它是一种好习惯。

所以,两者之间有什么区别

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

vs

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

我可以看到在该方法的实现中有一些异常处理,但这已经超越了我。 赞赏。

1 个答案:

答案 0 :(得分:1)

Defer将确保每个订户可以独立于其他订户而获得自己的源序列。让我用两个例子来说明它:

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

在第二个示例中,存在每个订户状态,否则将在所有订户之间共享。现在,由于每个订户都有自己创建的序列,因此两个索引项都像人们通常期望的那样。