Реактив: пытаясь понять, как работает тема <T>
Пытаясь понять, какSubject<T>
, ReplaySubject<T>
и другие работы. Вот пример:
(Субъект является наблюдаемымand наблюдатель)
public IObservable<int> CreateObservable()
{
Subject<int> subj = new Subject<int>(); // case 1
ReplaySubject<int> subj = new ReplaySubject<int>(); // case 2
Random rnd = new Random();
int maxValue = rnd.Next(20);
Trace.TraceInformation("Max value is: " + maxValue.ToString());
subj.OnNext(-1); // specific value
for(int iCounter = 0; iCounter < maxValue; iCounter++)
{
Trace.TraceInformation("Value: " + iCounter.ToString() + " is about to publish");
subj.OnNext(iCounter);
}
Trace.TraceInformation("Publish complete");
subj.OnComplete();
return subj;
}
public void Main()
{
//
// First subscription
CreateObservable()
.Subscribe(
onNext: (x)=>{
Trace.TraceInformation("X is: " + x.ToString());
});
//
// Second subscribe
CreateObservable()
.Subscribe(
onNext: (x2)=>{
Trace.TraceInformation("X2 is: " + x.ToString());
});
Случай 1: странная ситуация - когда я используюSubject<T>
подписка не производится (???) - я никогда не вижу, чтобы & quot; X было: & quot; текст - я вижу только значение & quot; Значение: & quot; и & quot; Максимальное значение & quot; ... ПочемуSubject<T>
не подталкивает значения к подписке?
Случай 2: если я используюReplaySubject<T>
- Я вижу значения в подписке, но не могу применитьDefer
вариант ни к чему. Не дляSubject
а не в Observable .... Так что каждая подписка будет получать разные значения, потому чтоCreateObservable
функцияcold наблюдаемым. ГдеDefer
?