Субъект RxJS — это особый тип Observable, который позволяет передавать значения множеству наблюдателей. Субъекты похожи на EventEmitters: они поддерживают реестр многих слушателей. Когда мы говорим о Субъектах или любых наблюдаемых в целом, есть две вещи:

  • Отправитель
  • И приемник

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

Существует три типа предметов:

  1. Тема — по умолчанию (и сфера действия этой статьи).
  2. BehaviorSubject — который всегда имеет значение
  3. ReplaySubject — хранит записи о прошлых значениях.

Here обсудим приложение чата:

Есть два компонента: отправитель сообщения и получатели (или получатели в случае группового чата).

Для связи между двумя компонентами нам нужно:

  1. Общий сервис, который можно внедрить в оба компонента
  2. Вызов метода подписки в приемнике
  3. Вызов следующего метода в отправителе

Шаг первый: создание общего сервиса

Вот общий сервис с двумя субъектами. Один для отправки сообщения от FirstComponent к SecondComponent и другой для обратного.

@Injectable({
  providedIn: 'root'
})
export class DataserviceService {
  messageFirst = new Subject();
  messageecond = new Subject();

  constructor() {
  }
}

Внедрите общий сервис в FirstComponent и SecondComponent, используя внедрение зависимостей следующим образом:

import {DataserviceService} from ‘../dataservice.service’;
export class FirstComponent implements OnInit {
constructor(private service: DataserviceService) {}
}

Аналогичным образом введите в SecondComponent.

Шаг второй: вызов следующего метода для отправки данных

Теперь по нажатию кнопки нам нужно получить последнее сообщение, создать метод отправки, который вызывается, а затем запускает следующий метод по теме:

FirstComponent:
send(message: string): void {
this.service.messagefirst.next(message);
}

И аналогично при отправке из SecondComponent в FirstComponent:

SecondComponent:
send(message: string): void {
this.service.messagesecond.next(message);
}

Шаг третий: Подписка на субъектов для получения данных

И последнее, но не менее важное: нам нужно подписаться на темы:

Первый компонент:

ngOnInit(): void {
    this.service.messageFirst.subscribe((param: string) => {
    // do something with the received message});
}

И аналогично получить во втором компоненте:

ngOnInit(): void {
    this.service.messageSecond.subscribe((param: string) => {
    // do something with the received message});
}

Шаг четвертый: отправка не только строки

Следующий метод поддерживает отправку только объекта — будь то строка, число, массив или любой объект Javascript. Если у вас есть несколько значений, мы можем создать интерфейс и передать его следующему методу.

interface Message {
    text: string;
    time: Date;
    Sender: string;
    Receiver: string;
}

Резюме

Связь между компонентами может быть достигнута с использованием общей службы и субъекта. Для этого вам необходимо:

  1. Общий сервис для отправителя и получателя
  2. Следующий вызов метода в отправителе
  3. Вызов метода подписки в получателе.