2017-05-25 73 views
0

我是新来的角2,并希望做一个调用依赖于下一个调用的嵌套http调用。我的代码是在服务如下:在angular2 rxjs嵌套的http调用

getUserPosts(): Observable<any[]>{ 
    return this.http.get(this.apiUserURL + this.userId + '/') 
     .map((response: Response) => response.json()) 
     .flatMap((users) => { 
      return Observable.forkJoin(
       users.map(user=> 
        this.http.get(this.apiUserPostURL + user.id) 
        .flatMap(response => response.json()) 
       ) 
      ) 
     }) 
} 

在组件中我有:

ngOnInit() { 
this.results = this.postsService.getUserPosts() 
    .subscribe(posts => { this.posts = posts 
    console.log(posts); 
    }) 

}

当我这样做,我得到的每一个用户的最后一个职位,但并不是所有的帖子。 (我有3个职位为每个用户,我有我的数据库中有两个用户,但低于我得到每个用户只有一个职位:

(2)[对象,对象] 0:对象 1:对象

解决方案预计:得到这样所有用户的所有帖子: (6)对象,对象,对象,对象,目标,对象]

当我我服务的最后部分更改为以下:

users.map(user=> 
    this.http.get(this.apiUserPostURL + user.id) 
    .map(response => response.json()) 
) 

我得到的各3个职位两个阵列,我不知道如何访问这些职位与* ngFor:

(2)[阵列(3),阵列(3)] 0:阵列(3 ) 0:对象 1:对象 2:对象 1:阵列(3) 0:对象 1:对象 2:对象

解预期:直接与阵列而无需一个阵列,而是一个包含所有对象的数组: (6)[Object,Object,Object,Object,对象,对象]

我甚至尝试做别的事情至极我想将加入.flatMap到我的组件帮助如下:

ngOnInit() { 
this.results = this.postsService.getUserPosts() 
.flatMap(posts => this.posts = posts) 
    .subscribe(posts => { this.posts = posts 
    console.log(posts); 
    })  

}

,但我有两个单独的阵列,每个阵列都与每个用户的所有帖子相关联,* ng仅挑选最新用户并忽略其他用户的其他帖子:

(3)[Object,Object,Object] 0:Object 1:对象 2:对象 (3)[对象,对象,对象] 0:对象 1:对象 2:对象

解预期:两个阵列合并成一个阵列: (6 )[对象,对象,对象,对象,对象,对象]

任何人都可以请求帮忙弄清楚如何解决这个问题? 非常感谢!

+0

尝试在这里使用的地图,而不是flatMap:this.http.get(this.apiUserPostURL + user.id).MAP(响应=> response.json ()) –

+0

@Julia Passynkova我在我上面的帖子的第二部分做了这个,我没有得到所需的解决方案。任何其他建议? – Hamid

+0

使用.flatMap((users)=> {...])。map(x => [] .concat.apply([],x)) –

回答

0

谢谢Julia Passynkova她的回答,以便解决我的问题。这是通过添加最后一行concat的最终解决方案。适用于(),以我的服务:

getUserPosts(): Observable<any[]>{ 
return this.http.get(this.apiUserURL + this.userId + '/') 
    .map((response: Response) => response.json()) 
    .flatMap((users) => { 
     return Observable.forkJoin(
      users.map(user=> 
       this.http.get(this.apiUserPostURL + user.id) 
       .flatMap(response => response.json()) 
      ) 
     ) 
    }).map(x=> [].concat.apply([],x)) 

}