合并在RxJS / Angular 6

时间:2018-05-15 19:26:49

标签: angular rxjs

我一直试图找到这个答案,但是作为RxJS和Angular(2+)的新人,我正在寻找一种方法来组合两个HTTP GET调用的结果。一旦完成一个呼叫,就必须根据该结果进行新的呼叫。第一次通话的结果将与第二次通话合并。优选地,在具有对象类型的属性中。

我一直在玩mergeMapswitchMapconcatMap。根据文档和指南,这些功能应该做我想要实现的目标。但是怎么样?

在我的例子中,我有一个ID(例如3)。这是我的代码:

this.postsService.getPostData(postId)
.switchMap(
  postData => Observable.forkJoin(this.getUserByPostData(postData))
)
.subscribe( result => console.log(result) );

由于getPostData

,这两个函数(getUserByPostDatahttp.get)都会返回Observables

在这种情况下,特别是由于forkJoin,我希望我的结果能够合并。但是,我检索的结果已经完全替换为第二个请求的结果(这是switchMap函数中的一个)。

我如何将结果合并?是否也可以将第二个HTTP请求(this.getUserByPostData)的结果作为第一个请求结果的属性?

1 个答案:

答案 0 :(得分:8)

如果第二个请求取决于第一个请求的响应中的数据,并且您想要合并这两个响应,则可以在switchMap中使用this.postsService.getPostData(postId).switchMap( postData => this.getUserByPostData(postData).map( userByPostData => ({ postData, userByPostData }) ) ).subscribe(({ postData, userByPostData })=> console.log(postData, userByPostData)); 运算符:

getPostData

此外,如果mergeMap返回的observable是基于HTTP的,它只会发出一次,所以永远不需要切换。您可以改为使用{{1}}。