【问题标题】:return an observable after more subscribe in Angular6在 Angular6 中进行更多订阅后返回一个 observable
【发布时间】:2018-06-18 16:09:13
【问题描述】:

您好,我有多个应用程序的全球服务,我希望创建一个具有多个订阅的方法,以便存储和初始化我的所有数据,我希望在我的 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
}

我怎样才能做到这一点?我在文档中找不到信息。感谢您的帮助。这对我的工作很重要,我花了这么多时间白白研究:(

【问题讨论】:

    标签: rxjs observable angular6 subscribe


    【解决方案1】:

    所以既然你想一个接一个地发出多个异步请求,你应该使用可观察函数".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 ...

    【讨论】:

    • 您好,感谢您的回复,我已查找文档并找到了回复:initApp() :Observable{ return this.http.get('./assets/tata.json' ).pipe( mergeMap((tata: any) => { console.log(tata.key) return this.http.get('./assets/tutu.json').pipe( mergeMap((tutu: any) = > { console.log(tutu.key) return this.http.get('./assets/titi.json') }) )} )) } }
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多