Метод, содержащий подписку, вызывается несколько раз, следует ли мне каждый раз отписываться от старых подписок?
Я создаю приложение 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(...)
Вам также не нужно убирать это на уничтожении, так как он уже мертв после первой эмиссии.