避免在循环中使用嵌套的可观察订阅的正确方法是什么?

时间:2016-12-19 08:06:31

标签: angular typescript firebase rxjs rxjs5

我通过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);
        });
    }
});

我希望有人可以说明正确的方法以及背后的原因吗?

非常感谢任何帮助。

感谢。

1 个答案:

答案 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 streamMerge subarrays using Observables)。然后concatMap()重新发出内部Observable的值。

你也可以使用mergeMap(),它不会等到上一个Observable完成(不保证相同的项目顺序)。