Субъекты используются для многоадресной рассылки Observables. Это означает, что субъекты будут следить за тем, чтобы каждая подписка получала то же самое значение, что и выполнение Observable, совместно используемое подписчиками. Вы можете сделать это с помощью класса Subject. Но rxjs предлагает разные типы субъектов, а именно: BehaviorSubject, ReplaySubject и AsyncSubject.

Если вы думаете, что разбираетесь в предметах, читайте дальше! Еще я бы посоветовал прочитать другую мою статью о предметах: Понимание rxjs предметов.

Поведение

Один из вариантов Subject - это BehaviorSubject. BehaviorSubject имеет свойство хранить «текущее» значение. Это означает, что вы всегда можете напрямую получить последнее переданное значение из BehaviorSubject.

Есть два способа получить это последнее излучаемое значение. Вы можете получить значение, обратившись к свойству .value в BehaviorSubject, или подписаться на него. Если вы подписываетесь на него, BehaviorSubject напрямую передает текущее значение подписчику. Даже если подписчик подписывается намного позже, чем было сохранено значение. См. Пример ниже:

Здесь происходит несколько вещей:

  1. Сначала мы создаем тему и подписываемся на нее с подписчиком A. Затем Subject передает свое значение, а подписчик A регистрирует случайное число.
  2. Субъект излучает следующее значение. Подписчик A зарегистрирует это снова
  3. Подписчик B начинает с подписки на тему. Поскольку субъектом является BehaviorSubject, новый подписчик автоматически получит последнее сохраненное значение и внесет его в журнал.
  4. Субъект снова излучает новое значение. Теперь оба подписчика получат значения и внесут их в журнал.
  5. Наконец, мы регистрируем текущее значение Subjects, просто обращаясь к свойству .value. Это неплохо, так как синхронно. Вам не нужно звонить в систему подписки, чтобы получить ценность.

И последнее, но не менее важное: вы можете создавать BehaviorSubjects с начальным значением. При создании Observables это может быть довольно сложно. С BehaviorSubjects это так же просто, как передать начальное значение. См. Пример ниже:

ReplaySubject

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

При создании ReplaySubject вы можете указать, сколько значений вы хотите хранить и как долго вы хотите их хранить. Другими словами, вы можете указать: «Я хочу сохранить последние 5 значений, которые были выполнены за последнюю секунду перед новой подпиской». См. Пример кода ниже:

Здесь происходит несколько вещей:

  1. Мы создаем ReplaySubject и указываем, что хотим сохранить только последние 2 значения.
  2. Начинаем подписываться на Тема с Подписчика А
  3. Мы реализуем три новых значения в рамках предмета. Подписчик A зарегистрирует все три.
  4. Теперь начинается волшебство ReplaySubject. Мы начинаем подписываться с подписчика B. Поскольку мы сказали ReplaySubject сохранить 2 значения, он будет напрямую передавать эти последние значения подписчику B, а подписчик B будет регистрировать их.
  5. Субъект излучает другое значение. На этот раз подписчик A и подписчик B просто регистрируют это значение.

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

Опять же, здесь происходит несколько вещей.

  1. Мы создаем ReplaySubject и указываем, что хотим сохранить только последние 2 значения, но не дольше 100 мс.
  2. Начинаем подписываться с подписчика А
  3. Мы начинаем передавать значения Subject каждые 200 мс. Подписчик A подберет это и запишет каждое значение, которое испускается Субъектом.
  4. Мы начинаем подписываться с подписчика B, но делаем это через 1000 мс. Это означает, что субъект уже отправил 5 значений до того, как мы начнем подписываться. Когда мы создавали Subject, мы указали, что хотим сохранить максимум 2 значения, но не более 100 мс. Это означает, что по прошествии 1000 мс, когда подписчик B начинает подписку, он получит только 1 значение, поскольку субъект передает значения каждые 200 мс.

AsyncSubject

В то время как BehaviorSubject и ReplaySubject хранят значения, AsyncSubject работает немного иначе. AsyncSubject - это вариант Subject, в котором только последнее значение выполнения Observable отправляется его подписчикам и только после завершения выполнения. См. Пример кода ниже:

На этот раз ничего особенного не происходит. Но давайте пройдемся по шагам:

  1. Создаем AsyncSubject
  2. Подписываемся на тему с подписчиком А
  3. Субъект излучает 3 значения, но по-прежнему ничего не происходит.
  4. Подписываемся на тему с подписчиком Б
  5. Субъект излучает новое значение, но по-прежнему ничего не происходит
  6. Тема завершена. Теперь значения отправляются подписчикам, которые регистрируют значение.

Заключение

BehaviorSubject, ReplaySubject и AsyncSubject все еще можно использовать для многоадресной рассылки, как и с обычным Subject. Однако у них есть дополнительные характеристики, которые очень удобны в различных сценариях.

Считаете себя одним из лучших?

Я работаю в Founda старшим фронтенд-разработчиком, и мы ищем старших разработчиков, которые специализируются на Vue и / или Node.

Founda создает будущее информационных технологий в сфере здравоохранения. Мы основаны опытными техническими предпринимателями в январе 2019 года. Founda - это молодая и хорошо финансируемая компания в области технологий здравоохранения и низкого кода / без кода в Амстердаме.

Мы строили технологическую компанию с использованием современного стека с небольшой командой самостоятельных разработчиков. Мы стремимся развивать компанию с помощью высококвалифицированных специалистов.

Если вы думаете, что у вас есть все необходимое для построения будущего здравоохранения, и вы являетесь резидентом Европы. Напишите мне на [email protected].