在Angular6中更多订阅后返回一个observable

时间:2018-06-18 16:09:13

标签: rxjs observable angular6 subscribe

您好我有几个应用程序的全局服务,我希望制作一个方法有几个订阅,以存储和初始化我的所有数据,我希望在我的appComponent订阅此方法,但我不知道如何做那个

在我的服务中

private initData(isLogged: boolean) {
   this.http.get('/api/conf').subscribe(
      conf => {
        this.http.get('api/param').subscribe(
          tokResp => {
            this.appParams.token = tkResp.queoval;
            this.appParams.culture = tkResp.culture;
            this.appParams.GMT = tkResp.gmt;
            this.http.get('/api/trad').subscribe(
              trad => {
                this.label = trad
                // return an Observable
               }
             )
           }
         )
      }
   )
}

在我的AppComponent中

this.service.initData().subscribe(
result => {
   this.test = result
}

我该怎么做?我在文档中找不到相关信息。谢谢您的帮助。这对我的工作很重要,我花了很多时间无所事事地研究:(

1 个答案:

答案 0 :(得分:1)

因此,既然你想要一个接一个地创建多个异步请求,你应该使用observable函数".flatMap"(这非常类似于Promises" .then")。 " .flatMap"函数允许您等到第一个请求完成后再继续。

因此,在您的情况下,您希望您的服务看起来像这样:

private initData(isLogged: boolean) {
   return this.http.get('/api/conf').flatMap(
      conf => {
        return this.http.get('api/param');
      }
   ).flatMap(
      tokResp => {
        this.appParams.token = tkResp.queoval;
        this.appParams.culture = tkResp.culture;
        this.appParams.GMT = tkResp.gmt;
        return this.http.get('/api/trad');
      }
    ).flatMap(
       trad => {
         this.label = trad;
         return trad;
       }
    );
}

此函数将所有异步请求通过" .flatMap"链接在一起。这样只有在上一个请求完成后才会调用它们。

组件文件看起来很好,应该可以使用这个新服务。

  

总的来说,你永远不应该订阅内部的observable   的服务。你应该使用map,flatMap等函数   forkJoin ......