В чем практическая разница между всеми этими расширениями Reactive Observable? - PullRequest
7 голосов
/ 05 марта 2010

Учитывая BehaviorSubject, какова практическая разница между вызовом всех этих различных функций на нем?

  • First ()
  • Последний ()
  • LatestValue ()
  • MostRecentValue ()
  • NextValue ()
  • Single ()
  • Take (1)

Предполагая, что я правильно понимаю, все они должны делать то же самое, учитывая объект поведения.

Если так, то какой вызов является наиболее подходящим (под чем я подразумеваю: какой лучше всего передает мои намерения)? Первый или Единственный возможно?

Если нет, то в чем практические различия?

Ответы [ 2 ]

6 голосов
/ 07 марта 2010

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 будет ждать до тех пор, пока значение не придет, а затем вернет его «потребление» - то есть, если вы снова вызовете «Последний», он не вернет того же значения, что и последний вызов, он будет ждать до тех пор, пока не будет получено следующее значение.

0 голосов
/ 12 апреля 2013

Спасибо @RichardHein за отличный ответ.

Методы расширения блокировки действительно должны быть перемещены в свое собственное пространство имен, поэтому разработчик должен специально включить их в проект (или, в частности, в файл CS). Вы добавляете массу сложности с Rx, и случайно используя метод блокировки, вы в основном возвращаетесь к IList / IEnumerable.

Я думаю, что это самая большая ошибка, которую сделала команда Rx, я думаю, включив их по умолчанию, они пропустили «пропасть успеха» с Rx. Исправьте это, и я бы назвал Rx предпочтительным API при переходе от однопоточного + асинхронного в C # (т. Е. Почему .NET более мощный, чем, скажем, NodeJS).

...