5

Rxを使用して、サブジェクト内の現在のオブザーバーの数を取得するための最良の方法は何ですか?

メッセージを公開したいというシナリオがありますが、オブザーバーがいる場合に限ります。オブザーバーがいない場合は、別のことをする必要があります。

この問題を回避するために、私が行ったことは、独自のISubject実装を作成し、内部IObserverコレクションのカウントを公開することです。私はこれを行うための箱から出してすぐに使える方法があるに違いないと確信しています、私はRxが提供しなければならないものに完全に精通していません。

ありがとう!

4

3 に答える 3

9

プロパティを使用しSubject<T>.HasObserversます。

ソースコード

いつ導入されたのか正確には思い出せませんが、いつもそこにあったとは限りません。おそらくRx2.0で追加されました。

于 2014-09-09T03:44:14.737 に答える
5

可能な限り、独自の監視可能な(またはサブジェクト)実装を実装することは避けてください。

あなたは確かに助けるためにラッパークラスを書いてみることができます。

これを試して:

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
于 2012-11-30T00:52:06.477 に答える
4

使用 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
于 2017-05-06T08:39:36.037 に答える