一个Rx可观测对象

一个Rx可观测对象

本文介绍了一个Rx可观测对象,将作为ReplaySubject,但仅针对第一个订阅者?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

合成类似ReplaySubject但仅向第一个订阅者(当该订阅者连接时)发出一次累积序列的Rx可观测对象的优雅方法是什么?第一次订阅后,它应该与常规Subject一样。

这是.NET项目的答案,但我同样希望得到JavaScript/RxJS的回答。

我在谷歌上寻找了潜在的解决方案,最终我将推出我自己的解决方案,类似于how I approachedDistinctSubject

推荐答案

我稍微修改了similar question中的实现,将类的名称从ReplayOnceSubject改为ReplayFirstSubscriberOnlySubject

public class ReplayFirstSubscriberOnlySubject<T> : ISubject<T>
{
    private readonly object _locker = new object();
    private ISubject<T> _subject = new ReplaySubject<T>();

    public void OnNext(T value) { lock (_locker) _subject.OnNext(value); }
    public void OnError(Exception error) { lock (_locker) _subject.OnError(error); }
    public void OnCompleted() { lock (_locker) _subject.OnCompleted(); }

    public IDisposable Subscribe(IObserver<T> observer)
    {
        if (observer == null) throw new ArgumentNullException(nameof(observer));
        lock (_locker)
        {
            if (_subject is ReplaySubject<T> replaySubject)
            {
                var subject = new Subject<T>();
                var subscription = subject.Subscribe(observer);
                // Now replay the buffered notifications
                replaySubject.Subscribe(subject).Dispose();
                replaySubject.Dispose();
                _subject = subject;
                return subscription;
            }
            else
                return _subject.Subscribe(observer);
        }
    }
}
这可能不是最有效的解决方案,因为每个操作都会获取两个不同的([2-4]和[2-5]),但它应该也不会很糟糕。

这篇关于一个Rx可观测对象,将作为ReplaySubject,但仅针对第一个订阅者?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 05:03