2016-05-01 4 views
15

私は暑いものと寒いものとの違いを理解していますが、私はいつも寒いのではなく熱い観察可能なものを使っている人を見ています。実際、誰かが偶然冷たい観察可能なものを使用すると、それはしばしば望ましくない行動の原因となるため、間違いとみなされます。コールドオブザーバブルのユースケースは何ですか?

熱いものよりも冷たい観察可能なものを好む、または使用したい場合はどうなりますか?

+0

*使用しないときは寒いです*。 observableは、使用されているかどうかに関係なく作成できますが、リソースは必要ありません。 – Bergi

+0

@Bergiだから何が利点ですか?怠惰? – m0meni

答えて

5

最初に、Hot and Cold observables : are there 'hot' and 'cold' operators?を確認して、熱いものか寒いものかを完全に理解できるようにしてください。

低温観測はプロデューサの遅延を許し、非常に望ましい機能です。これらの値を使用しない場合(消費者なし)、価値を生み出すことは無駄です(生産は高価になる可能性があります)。そのような冷たい観測は、より頻繁に熱い観測値が得られるビルディングブロックです。

このように、コールドオブザーバブルの最も一般的な使用例は、熱い観測値を怠惰に派生させることです。あなたがそれについて考えるなら、あなたは何らかの形でこれらの熱い観測物をプログラム的に構築する必要があります。 1つの方法は、サブジェクトを使用することです(あなたはプロデューサーです)。他の方法は、他の既存のオブザーバブルからオペレータ、既存のオブザーバブルを他のものから派生させることです。チェインの終わりにはRx.Observable.createがあり、それは寒い観察可能です。

怠惰が必要なときにコールドオブザーバブルを使用します(コンシューマがいるときだけの値を生成したり、プロダクションプロセスの開始を制御しているときのみ)。たとえば、deferでは、コンシューマが存在する場合にのみプロデューサを開始できます。それはあなたが熱い観測可能性を持っているが、それを聞く準備ができていないときに使用できます。

値生成プロセスを再現する必要がある場合は、コールドオブザーバブルも必要です(新規登録者はすべて同じプロセスを再開します)。これは、テスト目的のためのケースです。正確に同じシーケンスを何回か使用したいのですが、異なる消費者と異なる時間に使いたい場合です。

最後に、この質問は哲学的なもののように聞こえます。 2つのツールを自由に使い分けることができます。重要なことは、必要なもの、理解していること、理解していることです。

2

熱いものよりも冷たい観察可能なものを好むか使用するのはどのような場合ですか?

私は明白なことを述べていないよ願っていますが、あなたはすべての値にアクセスしたいどのような状況に観察者の履歴から(またはいくつかのサブセットが完全なセットをフィルタリングすることによりに到着しました)。

最初の例は、登録した後に到着したスコアだけでなく、学生のテスト得点の平均をすべてとしています。

+0

ああ、それは理にかなっています。あなたはあなたの答えを少し一般化できますか?それ以外の場合はありますか?彼らは何の共通点を共有していますか?最後に、なぜホットストリームでこれらのことを達成できないのですか? – m0meni

+1

@ ar7私が理解している限り、観測可能な完全な履歴(または、その全体の一部をフィルタリングすることによって到着したサブセット)を含むシナリオは、寒冷な観測可能性を必要とします。また、[this](http://stackoverflow.com/questions/2521277/what-are-the-hot-and-cold-observables#3522506)の回答とリンクされたブログ投稿は、怠惰に関するあなたの質問に触れる。 – pdoherty926

+1

@ ar7さらに、私は、RxJSの[Analogiesセクション](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.martinfo/creating.md#cold-vs-hot-observables)ドキュメントを啓発する – pdoherty926

4

答えのコアはベン・レッシュの簡潔な要約である:

TL; DR:あなたは何度も何度もあなたの プロデューサーを作成したくないときは、HOT、観察したいです。

「熱いものよりも冷たい観察可能なものを好むか、使用するのですか」という質問に直接答えて、一般的な回答と具体的な例の両方を提供します。

一般的に、ホットなものを作成し、それを争うのではなく、必要なときに作成されるストリームをモデル化するために、コールドオブザーバブルを使用する方がはるかに便利です。

具体的には、以下の簡単な例を考えてください。ボタンをクリックすると10にカウントダウンして反応したいとします。カウントダウン中にもう一度ボタンをクリックすると、再び10に戻ります。$モデルをクリックすると、次のようなイベントが発生します。

const subscription = click$ 
    .flatMapLatest(_ => Rx.Observable.interval(1000).take(10)) 
    .select(x => 10 - x) 
    .subscribe(x => console.log('clicked: ' + x)); 

これは、寒冷な観測なしにモデル化する方法を検討してください。どうすればよいですか:

  1. 必要に応じて適切な値が得られるようにストリームをあらかじめ初期化していますか?
  2. インターバルティックとサブスクリプションの時間の間に1秒の割合で対処する必要はありませんか?
  3. 1から始めるのではなく、任意の数で開始できる序数を扱う?
  4. ストリームのクリーンアップロジックを管理しますか?

1と3はかなり簡単に扱うことができますが、2と4は厄介です。

2番目の質問に「私は怠惰ですか?私はそうではないと主張するだろう。冷たい観察可能なものは、サブスクリプションの瞬間まで値を生成するために残すことができます。熱心な観察者は、サブスクリプションの瞬間までそれを残して、適切なイベントをフックすることができます。彼らはどちらも自分のやり方で怠け者です(少なくとも、できます)。主な違いは、ベン・レッシュの言ったことです:プロデューサーを毎回作りたいですか?そして時には、あなたは本当にそうです。

関連する問題