Каково использование случайных наблюдений?

Я понимаю различия между горячими и холодными наблюдаемыми, но я всегда вижу людей, использующих горячие наблюдаемые вместо холода; на самом деле, если кто-то случайно использует наблюдаемый холод, он считается ошибкой, поскольку это часто является причиной нежелательного поведения.

Какой случай, когда вы предпочитаете или используете холодный наблюдаемый по горячей?

Ответы

Ответ 1

Прежде всего, я приглашаю вас рассмотреть Горячие и холодные наблюдаемые: есть ли "горячие" и "холодные" операторы?, чтобы убедиться, что у вас есть полное понимание от холода и холода.

Холодные наблюдаемые допускают ленивость производителей, и это очень желательная особенность. Это отходы для производства ценностей (производство может быть дорогостоящим), когда использование этих значений не используется (без потребителей). Поскольку такие холодные наблюдаемые являются строительным блоком... из которого чаще всего выходят горячие наблюдаемые.

Таким образом, наиболее распространенным вариантом использования холодных наблюдаемых является ленивое получение горячих наблюдаемых. Если вы думаете об этом, вам нужно как можно скорее программно построить эти горячие наблюдаемые. Один из способов - использовать предметы (вы тогда являетесь продюсером). Другой способ состоит в том, чтобы вывести их из других существующих ранее наблюдаемых через операторов, существующих ранее наблюдаемых, которые также получены из других и т.д. В конце цепи вы должны найти Rx.Observable.create, и это холодно наблюдаемое.

Вы используете холодное наблюдение, когда вам нужна ленивость (начиная производить значения только тогда, когда есть потребители, или контролировать начало производственного процесса). Например, defer позволяет запускать производителя только тогда, когда есть потребитель. Его можно использовать, если у вас есть, например, горячий наблюдаемый, но вы еще не готовы его слушать.

Вам также понадобятся холодные наблюдаемые данные, когда вам нужно воспроизвести процесс создания стоимости (каждый новый абонент перезапустит тот же самый точный процесс). Это, например, случай для целей тестирования, где вы хотите использовать одну и ту же последовательность несколько раз, но с разными потребителями и в разное время.

В конце концов, вопрос звучит скорее как философский. У вас есть два инструмента в вашем распоряжении, важно то, что вам нужно, что у вас есть и что работает для вашего случая использования.

Ответ 2

Ядро ответа лежит на лаконичном резюме Бена Лэша:

TL; DR: вы хотите, чтобы HOT наблюдался, когда вы не хотите создавать свои продюсер снова и снова.

В прямом ответе на вопрос "Какой случай, когда вы предпочитаете или используете холодный наблюдаемый по горячей?", я дам общий ответ и конкретный пример.

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

В частности, рассмотрим следующий тривиальный пример. Предположите, что вы хотите откликнуться на кнопку нажатием кнопки, считав ее с 10. Если во время обратного отсчета снова нажать кнопку, она начнется снова на 10. Если вы нажмете $models на события кнопок, вы можете иметь что-то вроде этого:

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

Подумайте, как это будет смоделировано без холодного наблюдения. Как вы:

  • Инициализировать поток заранее, чтобы при необходимости были доступны соответствующие значения?
  • Избегайте иметь дело с долей секунды между интервалами тиков и временем вашей подписки?
  • Сработайте с ординалами, которые могут начинаться с любого числа, а не только с 1?
  • Управлять логикой очистки для потока?

1 и 3 можно легко решить, но 2 и 4 являются неприятными.

В ответ на ваш второй вопрос: "Это лень?" Я бы сказал, что это не так. Холодный наблюдаемый может оставить его до момента подписки для получения своих значений. Горячий наблюдаемый может оставить его до момента подписки, чтобы перехватить соответствующие события. Они ленивы по-своему (или, по крайней мере, могут быть). Ключевое различие заключается в том, что сказал Бен Леш: вы хотите каждый раз создавать продюсера? И иногда, вы действительно это делаете.

Ответ 3

Какой случай, когда вы предпочитаете или используете холодный наблюдаемый по горячей?

Надеюсь, я не заявляю очевидного, но в любой ситуации, когда вы хотите получить доступ ко всем значениям (или некоторому подмножеству, полученному путем фильтрации полного набора) из наблюдаемой истории.

Первый пример, который приходит на ум, - это усреднение всех результатов тестов студентов, а не только баллов, которые были получены после того, как вы подписались.