1

假设我有以下代码:

BehaviorSubject<Integer> subject = BehaviorSubject.create();
BehaviorSubject<Integer> subject2 = BehaviorSubject.create();
subject.
        doOnNext(number -> subject2.onNext(number)).
        flatMap(number -> subject2).
        subscribe(number -> System.out.println("Number " + number));

for(int i = 0; i < 10; i++) {
    subject.onNext(i);
}

它产生的输出是:

Number 0
Number 1
Number 1
Number 2
Number 2
Number 2
Number 3
Number 3
Number 3
Number 3
Number 4
Number 4
Number 4
Number 4
Number 4

不断地。

我理解它为什么会发生 - 这是因为每次flatMap调用时,都会将新订阅者添加到subject2.

问题是 - 如何避免这种情况?

4

2 回答 2

2

尝试switchMap而不是flatMap.

switchMap只订阅Observable它收到的最后一个。它取消订阅所有以前订阅Observable的 s。

http://reactivex.io/RxJava/javadoc/rx/Observable.html#switchMap

于 2016-08-02T12:13:03.367 回答
1

您可以将 subject2 限制为内部的一个元素,flatMap如下所示:

flatMap(number -> subject2.first())

代码

    BehaviorSubject<Integer> subject = BehaviorSubject.create();
    BehaviorSubject<Integer> subject2 = BehaviorSubject.create();
    subject.
            doOnNext(number -> subject2.onNext(number)).
            flatMap(number -> subject2.first()).
            subscribe(number -> System.out.println("Number " + number));

    for(int i = 0; i < 10; i++) {
        subject.onNext(i);
    }

产生不包含重复的输出

于 2016-07-28T15:16:39.583 回答