RxJs5 in Angular:链接不转换数据的可观察对象的正确方法是什么?

RxJs5 in Angular:链接不转换数据的可观察对象的正确方法是什么?,angular,rxjs5,Angular,Rxjs5,我必须从Angular2应用程序调用三个web服务,并且必须链接它们。它们都可以一起调用,所以我使用forkJoin。但后来,我不得不使用一个服务返回的Id调用另一个服务。 用forkJoin的结果链接最后一个服务的正确方法是什么 虽然我可以使用flatMap,但最后一个服务不会对从forkJoin获得的数据进行转换(map和flatMap称为转换运算符。它们只应在我们将返回的数据转换为其他数据时使用) 我是否应该订阅forkJoin,然后在成功的情况下,再订阅最后一个服务(我不喜欢它)?或者我

我必须从Angular2应用程序调用三个web服务,并且必须链接它们。它们都可以一起调用,所以我使用forkJoin。但后来,我不得不使用一个服务返回的Id调用另一个服务。 用forkJoin的结果链接最后一个服务的正确方法是什么

虽然我可以使用flatMap,但最后一个服务不会对从forkJoin获得的数据进行转换(map和flatMap称为转换运算符。它们只应在我们将返回的数据转换为其他数据时使用)

我是否应该订阅forkJoin,然后在成功的情况下,再订阅最后一个服务(我不喜欢它)?或者我应该使用Zip(或ZipAll)操作符吗? 事先非常感谢

编辑:我将提供一个例子。 比如说,我必须获得一些项目信息,我有三项服务:

  • getProject(projectId)
    :获取项目的相关信息,如标题、持续时间等。。。以及一个projectPropertiesId,其中包含一些项目可以拥有的属性

  • getProperties()
    :获取任何项目都无法拥有的所有属性的列表

  • getProjectProperties(propertiesId)
    :获取所选属性的列表。 一种解决办法可以是:

  • this.subscriber1=Observable.forkJoin(this.projectService.getProject(projectd),this.projectService.getProperties())
    .订阅(数据=>{
    this.project=数据[0];
    this.properties=数据[1];
    此参数为0.subscriber2=
    this.projectService.getProperties(this.project.propertiesId)
    .订阅(selectedProperties=>{
    //保存选定的属性。。。
    }
    });
    

    在拥有forkJoin之后,最好使用Zip操作符链接最后一个服务调用(projectService.getProperties)相反,在另一个订阅者中有一个订阅者?

    通常不建议嵌套
    订阅者
    ,您应该将所有内容都保存在一个
    流中
    。我不完全理解您的示例,但我认为您要求的是并行调用两个服务,一旦它们都返回,然后使用val调用第三个服务从产生的2个首次服务调用中删除ues

    您可以这样做,假设初始服务的两个可观察项都已完成。
    forkJoin
    等待两个都完成

    this.subscription = Observable
        .forkJoin([this.projectService.getProject(projectId), this.projectService.getProperties()])
        .switchMap(([project, properties]) => this.projectService.getProjectProperties(project.somevalue, properties.somevalue))
        .subscribe(data => {
            // save the selected properties...
        });
    

    欢迎来到Stack Overflow,不幸的是,目前的答案是:这要看情况而定。也许你可以添加一些代码来告诉我们你做了什么。这样就更容易弄清楚你想要实现什么。“我必须称三个web服务为”vs.“它们都是”3或2“?我必须将它们链接为”vs.“我使用forkJoin”链还是叉?一个例子会很有用。我用一个例子编辑了这个问题…谢谢你的回答。你为什么选择
    switchMap
    而不是
    zip
    ?我认为没有必要将两个初始调用的结果合并到流中,你只需要将它们作为调用第三个的参数。。