Зачем подписываться на Observable, возвращающий список моментальных снимков документа FireStore, я не могу создать правильный список объектов? Я получаю неопределенные объекты - PullRequest
0 голосов
/ 14 июля 2020

Я борюсь с AngularFire в проекте Angular, пытаясь выполнить запрос к базе данных FireStore, который извлекает все документы в коллекции и соответствующий UID.

Обычно у меня следующая ситуация:

введите описание изображения здесь

Итак, как вы можете видеть, на данный момент у меня есть только одна коллекция с именем calendar, содержащая некоторые документы, где каждый документ представляет собой событие в календаре (но эта деталь сейчас не так важна).

В моем Angular приложении у меня есть класс обслуживания, содержащий этот метод, который просто выполняет запрос для извлечения всех документов из моей коллекции календаря с помощью метода snapshotChanges () , чтобы сохранить весь снимок, включая UID и данные :

getEvents(): Observable<any[]> {
    this.items = this.db.collection('calendar').snapshotChanges();

    return this.items;
}

Затем в код TypeScript компонента я подписываю объект Observable возвращается предыдущим методом, чтобы построить объект, содержащий UID и данные. Я сделал это следующим образом:

this.eventService.getEvents().subscribe(eventsSnaps => {
  this.events = eventsSnaps.map(currentCourseSnap => {
    console.log("DOCUMENT ID: ", currentCourseSnap.payload.doc.id);
    var currentCourse = {
      id: currentCourseSnap.payload.doc.id,
      ...currentCourseSnap.payload.doc.data
    }
  })
  console.log("EVENTS FROM SNAPS: ", this.events);
});

И здесь я получаю странное поведение.

Первый console.log () правильно распечатывает полученный UID всего документа, полученного из FireStore, но второй consle.log (), печатающий весь массив построенного объекта, извлекает массив undefined , в моей Chrome консоли я получаю этот вывод:

EVENTS FROM SNAPS:  (16) [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]

Почему это не могу правильно построить мои объекты? Что случилось? Что мне не хватает? Как я могу решить эту проблему?

1 Ответ

2 голосов
/ 14 июля 2020

Когда фигурные скобки включены в стрелочную функцию, оператор return должен быть указан явно. Попробуйте следующее

this.eventService.getEvents().subscribe(eventsSnaps => {
  this.events = eventsSnaps.map(currentCourseSnap => {
    console.log("DOCUMENT ID: ", currentCourseSnap.payload.doc.id);
    var currentCourse = {
      id: currentCourseSnap.payload.doc.id,
      ...currentCourseSnap.payload.doc.data
    };
    return currentCourse;      // <-- return the object here
  });
  console.log("EVENTS FROM SNAPS: ", this.events);
});
this.eventService.getEvents().subscribe(eventsSnaps => {
  this.events = eventsSnaps.map(currentCourseSnap => ({
    id: currentCourseSnap.payload.doc.id,
    ...currentCourseSnap.payload.doc.data
  }));
  console.log("EVENTS FROM SNAPS: ", this.events);
});

Это похоже на запись

this.eventService.getEvents().subscribe(eventsSnaps => {
  this.events = eventsSnaps.map(currentCourseSnap => {
      return {
        id: currentCourseSnap.payload.doc.id,
        ...currentCourseSnap.payload.doc.data
      }
    }
  });
  console.log("EVENTS FROM SNAPS: ", this.events);
});
...