私は何の用途があるのだろうかと思っていますasObservable
:
ドキュメントによると:
ソースシーケンスのアイデンティティを隠す観察可能なシーケンス。
しかし、なぜシーケンスを非表示にする必要があるのでしょうか。
私は何の用途があるのだろうかと思っていますasObservable
:
ドキュメントによると:
ソースシーケンスのアイデンティティを隠す観察可能なシーケンス。
しかし、なぜシーケンスを非表示にする必要があるのでしょうか。
回答:
これの目的は、APIからサブジェクトの「オブザーバー側」がリークするのを防ぐことです。基本的に、結果のオブザーバブルに人々が「次へ」アクセスできるようにしたくない場合に、リークのある抽象化を防ぐためです。
(注:これは、実際には、このようなデータソースをObservableにする方法ではなく、new Observable
コンストラクターを使用する必要があります。以下を参照してください)。
const myAPI = {
getData: () => {
const subject = new Subject();
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subject.next({ type: 'message', data });
source.onOtherMessage = (data) => subject.next({ type: 'othermessage', data });
return subject.asObservable();
}
};
今、誰かが観察可能な結果を得るとき、myAPI.getData()
彼らは結果を評価することができませんnext
:
const result = myAPI.getData();
result.next('LOL hax!'); // throws an error because `next` doesn't exist
new Observable()
ただし、通常は使用する必要があります上記の例では、おそらく意図しないものを作成しています。1つは、getData()
ほとんどのオブザーバブルのように怠惰ではなく、基礎となるデータソースSomeWeirdDataSource
(およびおそらくいくつかの副作用)をすぐに作成することです。これは、あなたretry
またはrepeat
結果として得られるオブザーバブルが、あなたが思っているように機能しないことも意味します。
次のように、データソースの作成をオブザーバブル内にカプセル化することをお勧めします。
const myAPI = {
getData: () => return new Observable(subscriber => {
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subscriber.next({ type: 'message', data });
source.onOtherMessage = (data) => subscriber.next({ type: 'othermessage', data });
return () => {
// Even better, now we can tear down the data source for cancellation!
source.destroy();
};
});
}
上記のコードを使用すると、RxJSの既存の演算子を使用して、オブザーバブルの上に「怠惰ではない」ようにするなどの動作を構成できます。
result.subscribe(value => doSomething(value))
return subject.asObservable();
新しい観測量になります。単一のSubjectメンバー変数があり、onMessage / onOtherMessageは条件で、または初期化時に(すべての呼び出しではなく)宣言されます。関数にpipe( filter() )
提供されたパラメーターに基づいて、そのアプローチを使用しましたgetData()
。
subject
ことになってsubscriber
?
subject.next
行がsubscriber
。また、「結果のオブザーバブルを再試行または繰り返すと、思ったように機能しなくなります。」もっと具体的にできますか?あなただけの平均でくださいnew SomeWeirdDataSource()
たびに起こるために起こっているgetData
と呼ばれ、それをラップすることにより、つまりnew Observable
、あなたのサブスクリプションまで、そのインスタンス化を待機させます。私はあなたが呼ぶようなとき、私は表示されません推測getData
することなく、.subscribe
私はそこに値が欠落していますので。最後に、「データソースを破壊する」ために何が起こると思いますか?ありがとう。
AはSubject
両方として機能することができobserver
、およびobservable
。
AnにObervable
は2つの方法があります。
あなたがするたびにサブスクライブにobservable
、あなたが得るobserver
持っている次回、エラーと完全にそれのメソッドを。
ストリームソースをすべてのコンポーネントで公開したくないため、シーケンスを非表示にする必要があります。@BenLesh
同じことについては、の例を参照できます。
PS:Reactive Javascriptを初めて使用したときは、理解できませんでしたasObservable
。基本をはっきりと理解してからに行く必要があったからasObservable
です。:)