rxjs switchMap和嵌套的Observables

时间:2019-03-11 10:00:54

标签: angular firebase rxjs

我想向我的Firestore索要一系列文档,这些文档中包含引用其他文档的信息。

获取“用户”文档=>返回“项目”文档的ID => 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
          );
}

问题是Iam期望可观察到一系列物品。相反,我得到了一个可观察到的物品。

如何将其转换为

Observable<Item[]>

? 预先感谢!

我在Firestore中的结构如下:

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

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

用例换句话说: 我想获取与由其uid标识的特定用户相关的所有商品。

更新: 我发现所有concats mergs或forkJoins在这种情况下都不起作用,因为firebase可观察对象将永远不会完成。

我可以做类似...

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

但这会中断我的实时连接。除此之外,每次调用此函数都将导致在FireStore上进行读取,这将导致费用。

0 个答案:

没有答案