java - 订阅 Observable 而不触发它然后传递它

标签 java rx-java reactive-programming

这可能会变得有点复杂,而且我对 Observables 和 RX 模式没有那么丰富的经验,所以请耐心等待:

假设您有一些返回 Observable 的任意 SDK 方法。您使用一个类中的方法,该类除其他外还负责检索数据,并在执行此操作时进行一些缓存,因此我们将其称为 DataProvider。然后你有另一个类想要访问DataProvider提供的数据。现在我们将其称为Consumer。这样我们的设置就完成了。

给所有模式 friend 的旁注:我知道这不是 MVP,它只是我在应用程序中面临的类似但更复杂的问题的示例。

话虽这么说,在类似 Kotlin 的伪代码中,所描述的情况将如下所示:

class Consumer(val provider: DataProvider) {
    fun logic() {
         provider.getData().subscribe(...)
    }
}

class DataProvider(val sdk: SDK) {
    fun getData(): Consumer {
         val observable = sdk.getData()
         observable.subscribe(/*cache data as it passes through*/)
         return observable
    }
}

class SDK {
    fun getData(): Observable {
         return fetchDataFromNetwork()
    }
}

问题是,在 DataProvider 中调用 sdk.subscribe() 时,我已经触发了 Observable 的 subscribe() 方法这是我不想要的。我希望 DataProvider 只是默默地监听 - 在此示例中,触发应该由 Consumer 完成。

那么解决这个问题的最佳 RX 兼容解决方案是什么?上面伪代码中概述的肯定不是出于各种原因,其中之一是在消费者订阅 Observable 之前过早触发网络请求。在 DataProvider 中调用 subscribe() 之前,我已经尝试过 publish().autoComplete(2) ,但这似乎并不适用成为做这类事情的规范方式。只是感觉很hacky。

编辑:通过SO出色的“相关”功能,我刚刚偶然发现了另一个指向不同方向的问题,但有一个也适用于此处的解决方案,即 flatMap() 。我以前就知道这个,但从未真正使用过它。对我来说这似乎是一种可行的方法 - 您对此有何看法?

最佳答案

如果缓存步骤不应该修改链中的事件,则可以使用 doOnNext() 运算符:

class DataProvider(val sdk: SDK) {
    fun getData(): Observable<*> = sdk.getData().doOnNext(/*cache data as it passes through*/)
}

关于java - 订阅 Observable 而不触发它然后传递它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517306/

相关文章:

java - 使用 Scene Builder 8.0 在 JavaFX 中使用 setCenter() 方法获取空指针异常

android - Schedulers.immediate() 不适用于命令行 gradle 测试

java - RxJava : dynamically create Observables and send the final resut as Observable

java - 如何在 RxJava 中正确转换多播可观察对象

javascript - RxJS - 无限滚动 - 在上一个未到达时发送请求

java - Observable.just(doSomeLongStuff()) 在订阅 observable 之前运行 doSomeLongStuff()

c# - 订户丢失消息;这是 Rx 的错误还是我做错了?

java - 将附近的位置聚集到一个点并忽略较远的位置

java - Openfire 是否离线存储自定义消息类型(使用 PacketExtensions)?

java - 如何转换相同加载不同类加载器的两个实例?