提问者:小点点

包含订阅的方法被多次调用,我应该每次取消订阅旧订阅吗?


我正在构建一个带有订阅的Angular应用程序。该组件是一个聊天消息页面,其中有一个菜单,其中包含您与他人的所有聊天消息,您可以单击每个人以查看与该人的聊天消息。这是我在组件中的一个功能

getAllChatMessages() {

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

现在,每当用户点击与之聊天的其他人时,都会调用这个getAllChatMessages()函数。因此,在这种情况下,订阅会被多次调用,尽管使用不同的this.当前ChatIdthis.其他UserId取值直到只有在组件被销毁时才会取消订阅。

我真正不清楚的是,当它的另一个实例被下一个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个答案

匿名用户

是的-如果不再需要订阅,您应该取消订阅。使用采取运算符的示例:

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

你也不需要在销毁时清理它,因为它在第一次发射后已经死了。