Angular转换多个AngularFireDatabase.object调用Iterable Observable

时间:2018-03-12 23:09:43

标签: angular typescript angularfire2

我有一个使用AngularFireDatabase.list()函数从我的Google云实时数据库中检索到的密钥列表,我希望对每个密钥运行查询以获取与它们相关的信息。我一直在forEach循环中使用AngularFireDatabase.object('path/${key}')执行此操作。如何将所有这些单独的查询合并到类似Observable<Array<any>>类型的可迭代observable中,以便我可以在我的html模板中使用async管道?

到目前为止我的例子:

this.db.getEditors().snapshotChanges().subscribe(userRoles => {
  this.activeEditors = Observable.from(userRoles.map(x => x.key)).flatMap(x => this.db.afDb.object(`/users/${x}`)
    .valueChanges()).filter(x => x !== null).map(x => [{key : x.value}]);
});

this.activeEditors的类型为Observable<Array<any>>

HTML:

<ion-list>
  <ion-item *ngFor="let editor of activeEditors | async">
    <ion-title>{{editor.displayName}}</ion-title>
    <ion-label>{{editor.email}}</ion-label>
  </ion-item>
</ion-list>

我在此代码中遇到的问题是最后.map()调用只返回最后一个对象的数组。如何将所有值都放入this.activeEditors变量中,而不仅仅是最后一项?

1 个答案:

答案 0 :(得分:0)

this.activeEditors = this.db.getEditors().snapshotChanges().switchMap(editors =>
  Observable.combineLatest(editors.map { editor =>
    this.db.afDb.object(`/users/${editor.key}`)
      .valueChanges()
      .map(...)
  })
).filter(...);

switchMap上使用snapshotChanges(),然后在combineLatest使用进一步提取的映射。 filter从那里开始。