Angular 8 RX JS Очистить таблицу подписки - PullRequest
1 голос
/ 21 февраля 2020

У меня проблема с RX JS. Я создаю приложение веб-чата. Как только мой веб-чат потерял связь с Inte rnet, я хотел бы отправлять свои сообщения после того, как мое соединение станет доступным. Это отлично работает. Более того, я хотел бы получать сообщения из websocket, потому что мне нужно собирать сообщения, которые были отправлены мне, как только я был в автономном режиме. Это тоже отлично работает. Моя проблема в том, что я хотел бы сначала ОЧИСТИТЬ свои сообщения и собрать их еще раз. Прямо сейчас я собираю все сообщения, но он объединяется с предыдущими полученными сообщениями. Что я хотел бы сделать, это просто очистить, а после очистки снова поместить все сообщения в мой веб-чат.

Это мой код для сообщений:

this.messages = this.updates.pipe(
  scan((messages: Message[], operation: IMessagesOperation) => {
    return operation(messages);
  }, initialMessages),
  publishReplay(1),
  refCount()
);
this.create
  .pipe(
    map(
      (message: Message): IMessagesOperation => {
        if (message == null) {
          return (messages: Message[]) => {
            return [];
          };
        }
        const newMessage = { ...message };
        return (messages: Message[]) => {

          return messages.concat(newMessage);
        };
      }
    )
  )
  .subscribe(this.updates);
this.newMessages.subscribe(this.create);

Вот мой метод получения сообщений:

private reconnectAndGetMessages() {
this.reconnectToLastConversation(this.conversationId).subscribe(response => {
  const senderIds = [];
  const getChatMemeberInfoTasks = [];

  for (let i = 0; i < response.entities.length; i++) {
    const senderIdExists = includes(senderIds, response.entities[i].sender.id);
    if (!senderIdExists) {
      senderIds.push(response.entities[i].sender.id);
      getChatMemeberInfoTasks.push(this.getChatMemberInfo(response.entities[i].sender.id))
    }
  }

  forkJoin(getChatMemeberInfoTasks).subscribe(membersData => {
    for (let i = 0; i < response.entities.length; i++) {
      const entityResponse = response.entities[i];
      const chatMemberResponse = find(membersData, (el) => {
        return el.id === entityResponse.sender.id;
      });
      this.loaderService.display(false);
      this.messageService.parseMessageFromReconnect(entityResponse, chatMemberResponse);
    }
    this._showSendMessageConfirmation$.next(true);
  });
}, error => {
  this.firstConnectionWebChat();
});

}

Я совершенно не знаю, что делать, чтобы избежать повторного объединения всех моих сообщений из API с моими предыдущими отображаемыми сообщениями. Спасибо за любую помощь, спасибо!

...