7

BehaviorSubject が与えられた場合、これらのさまざまな関数をすべて呼び出すことの実際的な違いは何ですか?

  • 初め()
  • 最後()
  • 最新値()
  • MostRecentValue()
  • NextValue()
  • 独身()
  • テイク(1)

私がそれを正しく理解していると仮定すると、BehaviorSubject を考えると、それらはすべて同じことを行う必要があります。

もしそうなら、どの呼び出しが最も適切ですか (つまり、どの呼び出しが私の意図を最もよく伝えますか)? おそらくファーストまたはシングル?

そうでない場合、実際の違いは何ですか?

4

2 に答える 2

6

First、Last、Single はブロッキングです。代わりに Take(1) を使用することをお勧めします。これにより、IObservable が返されます。クエリ演算子をチェーンするときは、モナドの安全性を終了するため、First、Last、および Single を避けることをお勧めします...つまり、ブロッキングの副作用があるためです。詳細については、 http://blogs.msdn.com/jeffva/archive/2009/12/09/first-last-contains-etc-can-be-extremely-dangerous-yet-extremely-useful.aspxを参照してください。

最新のリリース ノートによると、MostRecentValue と LatestValue は Rx の最新バージョンから削除されました。これは、これらもブロックしているためです。したがって、残っているブロック演算子は、First、Last、Single (および xxxOrDefault バリアント) のみです。

MostRecent は、呼び出されるたびにサンプリングされた最後の値を返します (そして、待機しないことを保証するために initialValue が必要です)。つまり、Latest を再度呼び出すと、最後の呼び出しと同じ値は返されず、次の値が到着するまで待機します。

于 2010-03-06T22:20:18.817 に答える
0

素晴らしい答えをありがとう@RichardHein。

ブロッキング拡張メソッドは実際には独自の名前空間に移動する必要があるため、開発者はプロジェクト (または具体的には CS ファイル) に含めることを明確に選択する必要があります。Rx を使用すると複雑さが増し、誤ってブロッキング メソッドを使用してしまうと、基本的に IList/IEnumerable に戻ってしまいます。

これは Rx チームが犯した最大の間違いだと思います。IOW は、デフォルトでこれらを含めることで、Rx の「成功の落とし穴」を逃したと思います。これを修正して、C# でシングル スレッド + 非同期を超えて移動するときに、Rx を最適な API と呼びます (つまり、NodeJS よりも .NET の方が強力な理由)。

于 2013-04-12T13:31:49.347 に答える