合并多个可观察对象并更新现有订户?

时间:2019-06-04 21:10:51

标签: c# reactive-programming system.reactive reactive rx.net

如何将可能具有订阅者或不具有订阅者的热可观察物汇总到一个新的可观察物中,并继续向现有订户提供所有新数据?

例如,假设我们有这样的一个类:


class SomeClass
{

  IObservable<string> Actions { get; set; } = Observable.Empty<string>();

  void AddActionCreator(IObservable<string> creator)
  {
    Actions = Actions.Merge(creator);
  }
}

我遇到的问题是,如果AddActionCreator添加了新的操作流,那么在合并新流之前订阅的SomeClass.Actions的任何先前的订阅者将永远不会获得新的操作。

1 个答案:

答案 0 :(得分:2)

轻松完成您想做的事。这里需要的是SelectManySubject<IObservabe<string>>

这是您需要的课程:

public class SomeClass
{
    private Subject<IObservable<string>> _sources = new Subject<System.IObservable<string>>();
    public IObservable<string> Actions { get; private set; } = null;

    public SomeClass()
    {
        this.Actions = _sources.SelectMany(x => x);
    }

    public void AddActionCreator(IObservable<string> creator)
    {
        _sources.OnNext(creator);
    }
}

现在您可以像这样使用它:

var sc = new SomeClass();
sc.Actions.Subscribe(x => Console.WriteLine($"1:{x}"));
sc.AddActionCreator(Observable.Return("Hello"));
sc.Actions.Subscribe(x => Console.WriteLine($"2:{x}"));
sc.AddActionCreator(Observable.Range(0, 3).Select(x => $"{x}"));
sc.Actions.Subscribe(x => Console.WriteLine($"3:{x}"));
sc.AddActionCreator(Observable.Return("World"));

您将获得以下输出:

1:Hello
1:0
1:1
1:2
2:0
2:1
2:2
1:World
2:World
3:World

您可以看到新的可观测对象已添加到现有订户中。