从Observable创建BehaviorSubject

时间:2014-06-05 20:23:44

标签: reactive-programming rx-java

假设我有一个observableA从网络获取数据并发出它,如果我每次尝试从网络请求数据时都订阅这个observable。

我想创建BehaviorSubject并将其连接到observableA,这样任何其他线程/对象都会订阅BehaviorSubject以获取最新发布的数据。

到目前为止,我无法管理代码。我无法创建空的BehaviorSubject并在observableA中调用,因为它们彼此不相关。 我不能订阅observableA并将BehaviorSubject作为观察者,任何想法如何实现它?或者甚至更好?

3 个答案:

答案 0 :(得分:4)

您可以使用multicast。如,

Observable<String> o = ...;
ConnectableObservable<String> co = o.multicast(BehaviorSubject.<String> create());
co.connect();
co.subscribe(...);
co.subscribe(...);
co.subscribe(...);

答案 1 :(得分:1)

我在javascript中有类似的场景,我在Rx中包含了promise,当我订阅observable时,我不想再次进行网络调用。这就是我最终实现的方式:

   subject = new Rx.AsyncSubject();
   observable = Rx.Observable.fromPromise(....).subscribe(subject);

您现在可以将promise响应作为subject.subscribe(...)使用,它将始终从subject发出promise结果,因为我们正在使用AsyncSubject(AsyncSubject - 表示异步操作的结果.OnCompleted之前的最后一个值通知或通过OnError收到的错误发送给所有订阅的观察者。)

答案 2 :(得分:0)

在Rx.NET中,我们使用接受initialValue参数的Publish重载之一。从本质上讲,它只是一种更简单的方式来执行如zsxwing所描述的多播。我不确定Rx.Java是否提供了这些重载的Publish方法。