我通过Angularfire2使用Angular2和Firebase从Firebase实时数据库(基本上是一个大型JSON对象)获取一些数据。
我所拥有的是一个民意调查系统。民意调查在“民意调查”节点中,民意调查答案在“民意调查 - 回应”节点中。为了将这些链接在一起,我使用了“Poll-Response-Links”节点。
基本上,要获得民意调查的回复,我必须获取所有链接,然后从链接中获取回复。
以下代码有效,但我觉得这很糟糕。说这个,我不知道如何正确地做到这一点。
this.teamPollsService.getPollLinkList(id).subscribe((linkList) => {
this.responses = [];
for (let link of linkList) {
this.teamPollsService.getResponse(link['$key']).subscribe((response) => {
this.responses.push(response);
});
}
});
我希望有人可以说明正确的方法以及背后的原因吗?
非常感谢任何帮助。
感谢。
答案 0 :(得分:1)
如果您想以RxJS方式执行此操作,则可以使用concatAll()
解压缩列表,然后使用concatMap()
将每个项目转换为this.teamPollsService
所需的任何内容。
this.teamPollsService.getPollLinkList(id)
.concatAll()
.concatMap(link => this.teamPollsService.getResponse(link['$key']))
.subscribe(team => console.log(team));
(我没有测试此代码)
运算符concatAll()
展平数组(请参阅RxJS: JSON data with an array, processing each item further in the stream或Merge subarrays using Observables)。然后concatMap()
重新发出内部Observable的值。
你也可以使用mergeMap()
,它不会等到上一个Observable完成(不保证相同的项目顺序)。