【问题标题】: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 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        相关资源
        最近更新 更多