2017-02-03 6 views
1

RxJS 5share()演算子の動作を理解しようとしています。RxJS演算子がRx.Observable.ajaxと一緒に動作していることを理解しています

チュートリアルとドキュメントによれば、share()は、寒い観察可能なものを熱いものに変えます。

私は実際にそれを見ようとしています。ここで私が試したものです。その後、

const search$ = Rx.Observable.ajax('https://www.googleapis.com/books/v1/volumes?q=javascript').share(); 

そして、私はそれをサブスクライブは初めて:

search$.subscribe(console.log); 

私はネットワーク要求が発行されるのdevのツールから参照してください。

Request URL:https://www.googleapis.com/books/v1/volumes?q=javascript 

その後、同じサブスクリプションを再実行すると、

search$.subscribe(console.log); 

別のネットワーク要求もに発行されています。

誰かがshare()オペレーターがこの動作を表示している理由を説明できますか? 1つのネットワーク要求が発行されることを期待していました...

P.S.xxx.share();の代わりにxxx.publishLast().refCount();を使用してジョブを実行しますが、私の主な関心事は上記の文脈でshare()の動作を理解することです。

答えて

2

sharepublish().refCount()のショートカットです。 refCount -partは、少なくとも1人のサブスクライバが存在する限り、ストリームがホット/共有されていることを意味します。つまり、サブスクライバがない場合はリセット/コールドしています。 ajax -requestsが完了すると、ストリームが完了し、ストリームの完了時にすべてのサブスクライバが自動的にサブスクライブ解除されます。 - >ストリームのサブライバを0に設定し、ストリームをリセットします。今後の定期購読

なぜこれはpublishLast().refCount()で機能しますか? - publishLast()とすると、決して完了しないストリームが得られます。そのため、サブスクライバは自動的にサブスクライブされず、ストリームは決してリセットされません。


HTTPレスポンスをキャッシュする場合、publishLast().refCount()のアプローチは完全に有効です。

+0

ありがとうolsn。これにより、提示された動作がより明確になります。私が持っているもう1つの質問は、 'publishLast()。refCount()'であり、http要求をキャッシュするためには、暗に完了していないストリームが良い習慣とみなされていますか? – balteo

+0

はい、ありがとうございます - しかし、ここでrxjs-doc-sectionへの追加リンクを使って答えを更新しました。 – olsn

+0

この忌々しい返信とリンクに感謝します! – balteo

関連する問題