我有一个使用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
变量中,而不仅仅是最后一项?
答案 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
从那里开始。