зернокомбинация использует значения 2 раза с помощью Firestore только для 1 добавленной стоимости - PullRequest
2 голосов
/ 29 января 2020

Обновление 4: Здесь не используется функция Cloud. Только createMessage() метод.

Обновление 3: Пожалуйста, смотрите проблему как Gif. Нажмите на него, чтобы увидеть большой экран.

enter image description here

Обновление 2: Простая подписка, в которой значение генерируется 2 раза. Любая подсказка?

 this.chatSubscription = messagesPerChatGroup$.subscribe(async (messages, 
                        ) => {

                 //code

                });

Обновление: 1 Это срабатывает только 2 раза. Любая подсказка?

 this.chatSubscription = combineLatest([messagesPerChatGroup$, 
                      ]).subscribe(async ([messages, 
                    ]) => {

             //code

            });

Оригинал У меня есть эта подписка, и она работает нормально в первый раз.

const messagesPerChatGroup$: Observable<ChatMessageModel[]> = 
    this.chatService.getMessagesPerChatGroup(this.groupId);

const userActionsPerChatGroup$: Observable<UserActionModel[]> = 
    this.chatService.getUserActionsPerChatGroup(this.groupId);

const memberIdsPerChatGroup$: Observable<MessageGroupMemberModel> = 
    this.chatService.getMemberIdsPerChatGroup(this.groupId);

this.chatSubscription = combineLatest([
    messagesPerChatGroup$, 
    userActionsPerChatGroup$,
    memberIdsPerChatGroup$
]).subscribe(async ([messages, actions, memberIds]) => {
    //code             
});

service

getMessagesPerChatGroup(chatGroupId: string): Observable<ChatMessageModel[]> {
    return this.afs.collection<ChatMessageModel>(`messageGroups/${chatGroupId}/messages`).valueChanges();
}

Когда я добавляю элемент в вышеуказанную коллекцию this.chatSubscription выдает значения 2 раза. Почему это так и какое здесь решение? т. е. messageGroups/${chatGroupId}/messages

Так я добавляю записи.

async createMessage(chatGroupId: string, message: ChatMessageModel, userIdToken: string): Promise<void> {
    const messageDocId: string = this.afs.createId();
    await this.afs.doc<ChatMessageModel>(`messageGroups/${chatGroupId}/messages/${messageDocId}`).set({
        senderId: message.senderId,
        text: message.text,
        timeSent: message.timeSent,
        timeReceivedByServer: message.timeReceivedByServer,
        notificationSent: message.notificationSent,
    });
}

Метод кнопки отправки:

  send(): void {
    const message: ChatMessageModel = {
      senderId: this.uid,
      text: this.form.value.text,
      timeSent: firebase.firestore.Timestamp.fromDate(new Date(Date.now())),
      timeReceivedByServer: firebase.firestore.FieldValue.serverTimestamp(),
      notificationSent: false,
    };
    this.chatService.createMessage(this.groupId, message, this.userIdToken);
    this.form.reset();
  }
...