【问题标题】:Create BehaviorSubject from Observable从 Observable 创建 BehaviorSubject
【发布时间】:2015-08-28 02:43:50
【问题描述】:
假设我有一个observableA,它从网络获取数据并发出它,如果我每次尝试从网络请求数据时都订阅这个 observable,这很重。
我想创建 BehaviorSubject 并将其连接到 observableA,这样任何其他线程/对象都将订阅 BehaviorSubject 以获得最新发出的数据。
到目前为止,我无法管理它来编写代码。我无法创建空的 BehaviorSubject 并在 observableA 中调用,因为它们彼此不相关。
我无法订阅 observableA 并获得 BehaviorSubject 作为观察者,知道如何完成它吗?或者甚至更好?
【问题讨论】:
标签:
reactive-programming
rx-java
【解决方案1】:
您可以使用multicast。例如,
Observable<String> o = ...;
ConnectableObservable<String> co = o.multicast(BehaviorSubject.<String> create());
co.connect();
co.subscribe(...);
co.subscribe(...);
co.subscribe(...);
【解决方案2】:
我在 javascript 中有类似的场景,我在 Rx 中包装了 Promise,当我订阅 observable 时我不想再次进行网络调用。这就是我最终实施的方式:
subject = new Rx.AsyncSubject();
observable = Rx.Observable.fromPromise(....).subscribe(subject);
您现在可以将 Promise 响应作为 subject.subscribe(...) 使用,并且它将始终从主题发出 Promise 结果,因为我们正在使用 AsyncSubject (AsyncSubject - 表示异步操作的结果。OnCompleted 之前的最后一个值通知,或者通过 OnError 收到的错误,发送给所有订阅的观察者)。
【解决方案3】:
在 Rx.NET 中,我们将使用接受 initialValue 参数的 Publish 重载之一。从本质上讲,它只是一种更短的方式来进行像 zsxwing 描述的多播。我不确定 Rx.Java 是否提供这些重载的 Publish 方法。