Архитектура сервиса RxStomp в Angular

#angular #stompjs

#angular #stompjs

Вопрос:

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

В моем корневом компоненте у меня есть 2 страницы / компонента, которые будут использовать одну и ту же тему для подписки. Правильно ли инициировать тему просмотра в root (app.component.ts) или мне следует инициировать тему просмотра в 2 соответствующих компонентах и отказаться от подписки при уничтожении?

Ответ №1:

Очень интересный вопрос. Давайте подробно обсудим поведение.

Наблюдение довольно интересное. Он возвращает наблюдаемый объект. При этом subject может быть вызвано несколько подписок (точнее, RxJS подписывается). По-прежнему будет существовать одна базовая подписка. Когда последняя подписка (RxJS) отменяется, базовая подписка на STOMP будет отменена.

Итак, в родительском компоненте вы должны создать watch:

 watchTopic$ = this.rxStompService.watch('/topic/demo');
 

Передать watchTopic$ дочерним элементам (возможно, в качестве входного параметра или через сервис).

Внутри каждого компонента:

 topicSubscription = watchTopic$.subscribe((message: Message) => {
      // use it
    });


// Typically onDestroy
topicSubscription.unsubscribe();
 

Как только эта структура настроена, базовая подписка на STOMP будет инициирована с первым активным подписчиком и будет прекращена, когда последний подписчик уйдет.

Для справки, я человек, который написал руководство, упомянутое в вопросе.