Метод, содержащий подписку, вызывается несколько раз, следует ли мне каждый раз отписываться от старых подписок?

Я создаю приложение Angular с подписками. Компонент представляет собой страницу сообщений чата, где есть меню всех ваших сообщений чата для других, и вы можете нажать на каждого человека, чтобы просмотреть сообщения чата с этим человеком. Вот одна из моих функций внутри моего компонента

getAllChatMessages() {

  this.chatService
    .getChatMessages(this.currentChatId, this.otherUserId)
    .takeUntil(this.ngUnsubscribe)
    .subscribe(userProfile => {
      //some logic here
    });
}

Теперь это getAllChatMessages() Функция вызывается каждый раз, когда пользователь нажимает на другого человека, с которым они общаются. Таким образом, в этом случае подписка вызывается несколько раз, снова и снова, хотя и с this.currentChatId а также this.otherUserId, takeUntil только там, чтобы отписаться, когда компонент уничтожен.

Что мне действительно не ясно, так это то, что старые подписки все еще существуют, в то время как другой экземпляр создается с помощью следующего getAllChatMessages() вызов. Так как каждая подписка содержит свой ресурс, я должен отписываться от старой подписки каждый раз, когда getAllChatMessages() называется впоследствии?

РЕДАКТИРОВАТЬ:

Если мне нужно очистить старые подписки, я, вероятно, смотрю на что-то вроде этого? Таким образом, при каждом последующем звонке я удаляю и отменяю подписку на последний звонок getAllChatMessages(),

getAllChatMessages() {
  if (this.getChatMsgSub) {
    this.getChatMsgSub.unsubscribe();
  }

  this.getChatMsgSub = this.chatService
    .getChatMessages(this.currentChatId, this.otherUserId)
    .takeUntil(this.ngUnsubscribe)
    .subscribe(userProfile => {
      //some logic here
    });
  }

1 ответ

Решение

Да - вы должны отказаться от подписки, если подписка больше не нужна. Пример использования take оператор:

this.chatService
  .getChatMessages(this.currentChatId, this.otherUserId).pipe(take(1))
  .subscribe(...)

Вам также не нужно убирать это на уничтожении, так как он уже мертв после первой эмиссии.

Другие вопросы по тегам