rxjs switchMap и вложенные наблюдаемые - PullRequest
0 голосов
/ 11 марта 2019

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

get "user" document => возвращает идентификаторы "items" documents => foreach (get "item"document)

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
          );
}

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

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

Observable<Item[]>

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

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 11 марта 2019

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

Объединить все

Сглаживает наблюдаемые из наблюдений путем применения combLatestкогда Observable-of-Observables завершается.

concatAll

Преобразует наблюдаемый высшего порядка в наблюдаемый первого порядка путем объединения внутренних наблюдаемых в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...