在自己数据的flatMap内重新订阅相同的共享observable不会发出任何数据。按设计?

时间:2017-09-06 14:13:38

标签: rx-java2

尝试迁移到rx-java2并遇到了重新订阅其自身flatMap内的共享observable的问题。需要此模式来获取更新刷新链:

  1. 从网络获取当前数据(共享可观察以避免多个网络请求,如果多个观察者同时订阅了源)。
  2. 修改数据并将其发送回服务器(可填写)
  3. 更新完成后再次获取数据
  4. 整件事看起来像这样:

    @Test fun sharedTest() {
        val o = Observable.just(1).share()
        assertEquals(1, o
              .take(1)
              .flatMap({ 
                 Completable.complete()
                            .andThen(o) })
              .blockingFirst())
    }
    

    测试失败:java.util.NoSuchElementException 如果不共享o,一切正常。

    这种行为似乎是因为后一个订阅者在已经调度了单个原始值并且只能看到onComplete事件时出现。

    有人知道这是一种设计行为并以某种方式记录吗?当然有一种解决方法,但我需要知道原因,因为这有点烦人。该方法适用于Rx 1.x

    目前使用的是2.1.3版本

    编辑:

    似乎没有合法的方式来“重启”共享的观察及其副作用,因为目前无法保证其他订阅者不会收听。

2 个答案:

答案 0 :(得分:0)

查看分享'的气泡图。并且你会明白为什么它会像那样:Observable.share()

share()会发出订阅后发出的项目,它不会重新发出以前发出的项目。看看Observable.replay()的行为应该是您期望的行为。

答案 1 :(得分:0)

似乎没有合法的方法可以“重新启动”共享的observable及其副作用,因为目前无法保证其他订阅者不会收听。