web-dev-qa-db-ja.com

観察可能vs被験者およびasObservable

RxJを学習しています。想定に基づいて確認または修正を求めています。

サービスクラスのさまざまな場所で.next()を使用できるサービスでpublic read onlyを監視可能にしようとしています。これがそれを行う適切な方法であるかどうか私は思っています:

_private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();
_
  • ユーザーは_myObservable$_を購読できます
  • 使用できますmyObservable.next(...);

それは完全に機能しますが、私は無意識の馬鹿であるかもしれないことを知るのに十分な経験があります(RxJSは巨大です)。このユースケースでは、これは正しいパターンと正しいオブジェクトですか?

14
user9298624

あなたがやっていることは正しいです。ただし、まだ少し短い表記があります。 SubjectはすでにObservable(Observableクラスを継承)であるため、型チェックをTypeScriptに任せることができます。

_private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable;
_

サービスのコンシューマーは_myObservable$_をサブスクライブできますが、TypeScriptがそれを許可しないため、myObservable$.next()を呼び出すことはできません(Observableクラスにはnext()がありません方法)。

これは実際に推奨される方法であり、RxJSは内部的にasObservableを決して使用しません。詳細については、以下を参照してください。

非常によく似た質問を参照してください: rxjsサブジェクトをクラスで公開する必要がありますか?

8
martin

この種のオブザーバブルを使用しているプロジェクトでは、プライベートオブザーバブルを適切にカプセル化していますが、パブリックメソッドを使用してnext()を呼び出すことができます。

      private sourceName = new Subject<T>();
      name = this.sourceProductName.asObservable();

      sendName(item: T) {
        this.sourceName.next(item);
      }
3
Kraken