【问题标题】:FlatMap and subjects - how to avoid duplicating subscribers?FlatMap 和主题 - 如何避免重复订阅者?
【发布时间】:2016-07-28 13:30:02
【问题描述】:

假设我有以下代码:

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

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

【问题讨论】:

    标签: java rx-java reactive-programming subject-observer behaviorsubject


    【解决方案1】:

    尝试switchMap 而不是flatMap

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

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

    【讨论】:

      【解决方案2】:

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

      flatMap(number -&gt; 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);
          }
      

      产生不包含重复的输出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 2015-04-06
        • 1970-01-01
        相关资源
        最近更新 更多