107

私はビデオを見て、一般的な原則を知っています-誰も購読していないときでもホットは発生し、コールドは「オンデマンド」で発生します。また、Publish()はコールドをホットに変換し、Defer()はホットをコールドに変換します。

しかし、それでも、私は詳細が欠けていると感じています。これが私が答えたいいくつかの質問です:

  • これらの用語の包括的な定義を教えてください。
  • ホットオブザーバブルで公開またはコールドで延期を呼び出すことは意味がありますか?
  • ホット/コールド変換の側面は何ですか?たとえば、メッセージを失いますか?
  • IObservableとIEnumerableのホット定義とコールド定義に違いはありますか?
  • コールドまたはホットのプログラミング時に考慮すべき一般的な原則は何ですか?
  • ホット/コールドオブザーバブルに関する他のヒントはありますか?
4

4 に答える 4

56

ホットオブザーバブルは、オブザーバブルにサブスクライブしていないときにイベントをプッシュするものです。マウスの動き、またはタイマーの目盛りなどのように。コールド オブザーバブルは、サブスクライブしたときにのみプッシュを開始し、再度サブスクライブすると最初からやり直すものです。

于 2010-03-31T00:09:03.117 に答える
38

これが役立つことを願っています。

これらの用語の包括的な定義を教えてください。

私のブログ投稿を参照してください: https://leecampbell.com/2010/08/19/rx-part-7-hot-and-cold-observables

ホットなオブザーバブルで Publish を呼び出したり、コールドで Defer を呼び出したりするのは理にかなっていますか?

いいえ、私が考えることができるわけではありません。

ホット/コールド コンバージョンの側面は何ですか? たとえば、メッセージを失うことはありますか?

サブスクライバーに関係なく「イベント」が発生するため、Observable が Hot の場合、メッセージを「失う」可能性があります。

IObservable と IEnumerable のホット定義とコールド定義に違いはありますか?

質問がよくわかりません。この類推が役立つことを願っています。Hot Observable と Eagerly 評価済みの IEnumerable を比較します。つまり、List または Array は両方とも Eagerly 評価され、誰もそれらを列挙しなくてもデータが取り込まれます。ファイルまたはデータベースから値を取得する yield ステートメントは、Yield キーワードを使用して遅延評価できます。lazy は適切ですが、デフォルトでは、2 番目の列挙子が実行された場合に再評価されます。これらを Observable と比較すると、Hot Observable はイベント (ボタンのクリック) または温度のフィードである可能性があります。これらのイベントはサブスクリプションに関係なく発生し、複数のサブスクリプションが同じ監視対象に対して行われた場合にも共有されます。Observable.Interval は Cold オブザーバブルの良い例です。サブスクリプションが作成されたときにのみ、値の生成が開始されます。

コールドまたはホットのプログラミングで考慮すべき一般原則は何ですか?

ポイント1のリンクを参照してください。また、RefCount と組み合わせて使用​​されている Publsh を調べることをお勧めします。これにより、Cold Observable の遅延評価セマンティクスを持つことができますが、Hot Observable が取得するイベントを共有できます。

ホット/コールド観測量に関するその他のヒントはありますか?

手を汚して遊んでください。それらについて30分以上読んだら、それ以上読むよりもコーディングに費やす時間がはるかに生産的になります:)

于 2010-08-19T13:59:12.797 に答える
14

包括的な答えを出すふりをするのではなく、この質問の時から学んだことを最も簡単な形で要約したいと思います。

Hot observableは、イベントと完全に一致します。イベントでは、サブスクライバーがリッスンしていない場合でも、通常、値がハンドラーに入力されます。すべてのサブスクライバーは、同じ値のセットを受け取ります。「イベント」パターンに従うため、高温の観測量は低温の観測量よりも理解しやすくなります。

Cold observableもイベントのようなものですが、ひねりがあります-Cold observableのイベントは、共有インスタンスのプロパティではなく、誰かがサブスクライブするたびにファクトリから生成されるオブジェクトのプロパティです。さらに、サブスクリプションは値の生成を開始します。上記の理由により、複数のサブスクライバーが分離され、それぞれが独自の値のセットを受け取ります。

RXの初心者が犯す最も一般的な間違いは、関数内のいくつかの状態変数(fe累積合計)を使用してコールドオブザーバブルを作成し、それを.Defer()ステートメントにラップしないことです。その結果、複数のサブスクライバーがこれらの変数を共有し、それらの間で副作用を引き起こします。

于 2011-06-06T17:12:31.037 に答える