Rxjs switchMap и вложенные наблюдаемые объекты

Я хочу запросить у своего firestore массив документов, в которых содержится информация, ссылающаяся на другие документы.

получить документ «пользователь» => возвращает идентификаторы документов «элементы» => foreach (получить документ «элемент»)

getUserOwnedItems(uid:string):Observable<Item[]>{
    return this.firestore
          .collection<any>(`members`, ref => ref.where('uid', '==', uid))
          .valueChanges()
          .pipe(
            switchMap(ids => { // these ids are representing the "item" ids 
              return ids.map(id => {
                return this.firestore
                  .doc<Item>(`items/${id.itemId}`)
                  .valueChanges();
              });
            })
            ,concatAll() // <-- Iam not sure about this
          );
}

Проблема в том, что я ожидаю наблюдаемого с массивом элементов. Вместо этого я получаю наблюдаемое из Item.

Как я могу преобразовать это в

Observable<Item[]>

? Заранее спасибо!

Моя структура в firestore выглядит следующим образом:

members : [
 {
  uid:string,
  itemId:string,
  ...
 }
]

items : [
 {
  id:string,
  ...
 }
]

Вариант использования другими словами: Я хочу получить все элементы, связанные с конкретным пользователем, идентифицированным его uid.

Обновлять: Я обнаружил, что все слияния concats или forkJoins не работают в этом сценарии, потому что наблюдаемые данные firebase никогда не будут завершены.

Я мог бы сделать что-то вроде...

return this.firestore
   .doc<Item>(`items/${id.itemId}`)
   .valueChanges().pipe(first());

Но это нарушит мою связь в реальном времени. Кроме того, каждый вызов этой функции приведет к чтению в FireStore, что будет стоить денег.

Почему вы используете concatAll?

user4676340 11.03.2019 11:02

идея состоит в том, чтобы объединить все запросы и отправить их обратно как один Observable.

Danny 11.03.2019 11:07

SwitchMap возвращает один результат, поэтому у вас фактически есть один результат.

user4676340 11.03.2019 11:19
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
595
1

Ответы 1

Вероятно, вы хотели использовать combineAll вместо concatAll, если вам нужно Observable<Item[]>.

объединитьВсе

Flattens an Observable-of-Observables by applying combineLatest when the Observable-of-Observables completes.

concatAll

Converts a higher-order Observable into a first-order Observable by concatenating the inner Observables in order

Другие вопросы по теме