使用Rx,獲取主題中當前觀察者數量的最佳方法是什麼?Rx中的觀察者數量主題
我有,我要發佈消息的情況下,但前提是有觀察員。如果沒有觀察員,我需要做別的事情。
爲了解決這個問題,我所做的就是創建了自己的ISubject實現,公開內部IObserver收集的計數。我確信必須有一個開箱即用的方式,我只是不完全熟悉Rx所提供的。
謝謝!
使用Rx,獲取主題中當前觀察者數量的最佳方法是什麼?Rx中的觀察者數量主題
我有,我要發佈消息的情況下,但前提是有觀察員。如果沒有觀察員,我需要做別的事情。
爲了解決這個問題,我所做的就是創建了自己的ISubject實現,公開內部IObserver收集的計數。我確信必須有一個開箱即用的方式,我只是不完全熟悉Rx所提供的。
謝謝!
你應該避免實現你自己觀察到的(或學科)實現只要有可能。
你當然可以嘗試編寫一個包裝類來提供幫助。
試試這個:
public class Countable
{
private int _count;
public int Count { get { return _count; } }
public IObservable<T> GetCountable<T>(IObservable<T> source)
{
return Observable.Create<T>(o =>
{
Interlocked.Increment(ref _count);
var subscription = source.Subscribe(o);
var decrement = Disposable.Create(() =>
{
Interlocked.Decrement(ref _count);
});
return new CompositeDisposable(subscription, decrement);
});
}
}
然後你可以這樣寫代碼:
var xs = new Subject<int>();
var countable = new Countable();
var ys = countable.GetCountable(xs);
Console.WriteLine(countable.Count);
var s1 = ys.Subscribe(y => { });
Console.WriteLine(countable.Count);
var s2 = ys.Subscribe(y => { });
Console.WriteLine(countable.Count);
s1.Dispose();
Console.WriteLine(countable.Count);
s2.Dispose();
Console.WriteLine(countable.Count);
我運行這個結果是:
0
1
2
1
0
這對我有很大的幫助。謝謝。 – Zoman
而有趣的是,如果你使用的doOnUnsubscribe,它總是返回true,AFAICT – forresthopkinsa
使用subject.observers.length
,例如:
import {Subject} from 'rxjs'
let subject = new Subject()
let s1 = subject.subscribe(v => console.log('observerA: ' + v))
subject.next(1) // observerA: 1
console.log(subject.observers.length) // 1
let s2 = subject.subscribe(v => {
console.log('observerB: ' + v)
if(v===3) s2.unsubscribe()
})
subject.next(2) // observerA: 2
console.log(subject.observers.length) // 2
subject.next(3) // observerA: 3
console.log(subject.observers.length) // 1
我不知道,如果這個工程在RxJS,但即使是這樣,它不是標準Rx規範的一部分。如果我在推廣中看到這一點,我傾向於認爲這是一種黑客行爲。 – forresthopkinsa
爲什麼你會關心,如果您有觀察員或不? – casperOne
我不在乎我有觀察員,就像我沒有觀察員時一樣關心。 在我的應用程序中,我有處理某些消息的窗口。他們是觀察員。如果沒有窗戶打開,我創建一個新的窗戶。所以我需要知道什麼時候我沒有觀察員來創建一個新窗口。 – bedo
這聽起來像是你將放入觀察者的邏輯(不管它是在做你的窗口管理);把它放到你觀察的東西看來是一個糟糕的設計決定。 – casperOne