本文介绍了一个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,但仅针对第一个订阅者?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!