合并多个可观察量并更新现有订阅者?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (10)

如何将可能会或可能没有订阅者的热点可观察量聚合到一个新的可观察量中,并继续向现有订阅者提供所有新数据?

举个例子,假设我们有一些这样的类:


class SomeClass
{

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

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

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

提问于
用户回答回答于

做你想做的事很容易。你需要的是a SelectMany和a Subject<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:你好
1:0
1:1
1:2
2:0
2:1
2:2
1:世界
2:世界
3:世界

您可以看到新的observable已添加到现有订阅者。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • _逗你玩_

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答
  • uncle_light

    5 粉丝518 提问5 回答

扫码关注云+社区

领取腾讯云代金券