Subject - это особый тип Observable, который разделяет один путь выполнения между наблюдателями.

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

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

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

Тема - это объект с методами next (v), error (e) и complete (). Метод next () вызывается для установки следующего значения Subject, error () вызывается в случае возникновения ошибки, а метод complete () зарезервирован для сигнализации о том, что у источника больше нет значений для передачи наблюдателям. .

Ниже перечислены 4 типа предметов.

1. тема

2.behaviorSubject

3.replaySubject

4. asyncSubject

Все вышеперечисленные варианты Subject относятся к типу Observable и очень похожи, за исключением данных, которые они генерируют.

Очень простой пример этого предмета приведен в следующем разделе.

const subject = new Subject<number>();
subject.subscribe({
next: (val) => console.log( `observerA: ${ v } ` )
});
subject.subscribe({
next: (val) => console.log( `observerB: ${ v } ` )
});
const observable = from([ 1 , 2 , 3 ]);
observable.subscribe(subject);

Результатом приведенного выше фрагмента кода будет

// observerA: 1
// observerB: 1
// observerA: 2
// observerB: 2
// observerA: 3
// observerB: 3

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

В следующих строках мы создаем наблюдаемый объект с оператором from, который выдает значения одно за другим. Затем мы присоединяемся к наблюдаемому выше.

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

*** Если мы не вызываем метод next (), Subject не возвращает никакого значения.

Это был очень упрощенный обзор того, как работает Subject.

Кортси: http://code2stepup.com/

Сатьяприя Мишра - основатель сайта http://code2tepup.com/pact. Он является консультантом по программному обеспечению, корпоративным тренером и автором.