AgularFire объединяет 2 потока - PullRequest
1 голос
/ 08 марта 2020

Я пытаюсь объединить 2 потока данных, поступающих из Firebase, используя AngularFire, но мне трудно.

У меня есть коллекция с именем incomeShops, в которой есть ссылка на userID который создал эту указанную c запись. Что мне нужно сделать, это сделать второй вызов, чтобы получить данные пользователя, но я не могу.

Любая помощь?

Вот что у меня есть:


getAllIncomeShops() {
    const shops = this.venueService.getIncomeShops()
        .snapshotChanges()
        .pipe(
            switchMap(incomeShopSnaps => {
                // Mapping the result to extract the data I need using snapshotchanges().
                return incomeShopSnaps.map(incomeShopSnap => {
                    const shopObject = {
                        id: incomeShopSnap.payload.doc.id,
                        ...incomeShopSnap.payload.doc.data()
                    };
                    // On the shopObject there is a property called suggestedBy which contains a STRING with the user's ID.
                    // Trying to fetch the user's data to insert on the shopObject.
                    this.userService.getUser(shopObject.suggestedBy).valueChanges()
                });
            })
        ).subscribe(data => {
            console.log(data);
        });
}

1 Ответ

1 голос
/ 08 марта 2020

Вы можете создать массив наблюдаемых и ждать, пока все они завершатся с forkJoin().

switchMap(incomeShopSnaps => {
  // Mapping the result to extract the data I need using snapshotchanges().
  const requests = incomeShopSnaps.map(incomeShopSnap => {
    const shopObject = {
      id: incomeShopSnap.payload.doc.id,
      ...incomeShopSnap.payload.doc.data()
    };
    // On the shopObject there is a property called suggestedBy which contains a STRING with the user's ID.
    // Trying to fetch the user's data to insert on the shopObject.
    return this.userService.getUser(shopObject.suggestedBy).valueChanges()
  });

  return forkJoin(requests); // You can eventually `map()` results into something...
}),
...