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. Он является консультантом по программному обеспечению, корпоративным тренером и автором.