3

内部で Rx.Subject を使用する関数からオブザーバブルを返そうとしています。もちろん、優れた API と同様に、実装の詳細は消費者から完全に抽象化する必要があります。ただし、Subject.asObservable() を使用すると、任意の消費者がすべてのオブザーバーに新しい値を発行できるように見えます。

例:

const subject = new Rx.Subject();
const observable = subject.asObservable();

observable.source === subject; // true

observable.forEach(value => console.log(value));
observable.source.next('Hello'); 
// Causes the forEach above to print "Hello"

私の質問は、元のサブジェクトへのアクセスを許可せずに Observable を消費者に公開する組み込みの方法はありますか? そうでない場合、これは明らかに RxJ 側の悪い設計です。

注: これは RxJS v5 用です

4

1 に答える 1

1

これを真にカプセル化する唯一の方法は、関数内でサブジェクトをサブスクライブし、それらの値を発行する別の (サブジェクトまたはカスタム オブザーバブルのいずれか) を返すことです。

しかし、任意のオペレーター ( のような作成オペレーターでさえもObservable.combineLatest(subject)) には、何らかの方法でソースにアクセスできます。

これを「解決」する別の方法は、Typescript を使用することです。これは、TS コンパイラが、パブリック属性ではないため、の保護されたプロパティsourceにアクセスできないことを通知するためです: https://github.com/ReactiveX/rxjs /blob/master/src/Observable.ts#L30 - もちろん、ES5 には「保護」というものは存在しないため、コンソールから引き続きアクセスできます。Observable

于 2016-12-21T23:42:47.063 に答える