假设我有一个observableA
从网络获取数据并发出它,如果我每次尝试从网络请求数据时都订阅这个observable。
我想创建BehaviorSubject并将其连接到observableA,这样任何其他线程/对象都会订阅BehaviorSubject以获取最新发布的数据。
到目前为止,我无法管理代码。我无法创建空的BehaviorSubject并在observableA中调用,因为它们彼此不相关。 我不能订阅observableA并将BehaviorSubject作为观察者,任何想法如何实现它?或者甚至更好?
答案 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
方法。