【问题标题】:How can I get the current value of a Subject exposed as an IObservable?如何获取作为 IObservable 公开的主题的当前值?
【发布时间】:2015-09-04 12:06:41
【问题描述】:

我有一个具有IObservable<int> 属性的User 模型。此属性由使用特定值初始化的BehaviorSubject 支持。如何获取 observable 的当前值,而不必公开另一个访问底层 BehaviorSubject 上的 .Value 属性的属性?

这是要考虑的示例模型:

class User
{
    private readonly BehaviorSubject<int> mySubject;

    public User()
    {
        mySubject = new BehaviorSubject<int>(100);
    }

    public IObservable<int> Value => mySubject.DistinctUntilChanged();

    public void SomeMethod(int level)
    {
        mySubject.OnNext(level);
    }
}

请注意,我有一个方法可以在具有指定值的主题上调用OnNext。这对我来说已经很奇怪了,如果我可以将 Value observable 视为 get 和 set 属性会更好,但是唉......

在我的代码的另一部分,我需要强制获取给定用户的当前值,但我似乎无法直接从IObservable 接口找到一种方法来执行此操作。我尝试同时使用Latest 和MostRecent 方法,但它们的作用似乎与我的预期不同。两者都尝试时,我的应用程序会无限期阻塞。

我发现正确公开该值的唯一方法是为“当前”值创建另一个属性,如下所示:

public int CurrentValue => mySubject.Value;

我不喜欢这样,因为我觉得我是多余的。有没有更好的方法来公开 observable 的当前值,以便外部代码可以获取该值并用它做它想做的事情?就此而言,正如我之前评论的那样,我也不太高兴有另一种方法来改变值。在我看来,它使对象的界面很麻烦。例如,在 knockoutjs 中,我可以通过“调用”可观察对象来获取和设置值,这似乎更简单。在这种情况下,这将等同于 Value()。

【问题讨论】:

    标签: .net system.reactive observable


    【解决方案1】:

    您始终可以执行其中一项操作,具体取决于您是否处于 async 上下文中:

    var value = await user.Value.FirstAsync();
    var value = user.Value.First();
    

    或者,您可以执行以下操作:

    class User
    {
        private readonly BehaviorSubject<int> valueSubject;
        public int Value
        {
            get { return valueSubject.Value; }
            set { valueSubject.OnNext(value); }
        }
        public IObservable<int> ValueChanged => valueSubject.DistinctUntilChanged();
    
        public User()
        {
            valueSubject = new BehaviorSubject<int>(100);
        }
    }
    

    【讨论】:

    • 当前值不就是Value.Last()吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 2021-06-05
    • 2016-12-26
    • 2010-09-23
    • 2012-02-21
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多