我一直试图找到这个答案,但是作为RxJS和Angular(2+)的新人,我正在寻找一种方法来组合两个HTTP GET调用的结果。一旦完成一个呼叫,就必须根据该结果进行新的呼叫。第一次通话的结果将与第二次通话合并。优选地,在具有对象类型的属性中。
我一直在玩mergeMap
,switchMap
和concatMap
。根据文档和指南,这些功能应该做我想要实现的目标。但是怎么样?
在我的例子中,我有一个ID(例如3)。这是我的代码:
this.postsService.getPostData(postId)
.switchMap(
postData => Observable.forkJoin(this.getUserByPostData(postData))
)
.subscribe( result => console.log(result) );
由于getPostData
getUserByPostData
和http.get
)都会返回Observables
在这种情况下,特别是由于forkJoin
,我希望我的结果能够合并。但是,我检索的结果已经完全替换为第二个请求的结果(这是switchMap函数中的一个)。
我如何将结果合并?是否也可以将第二个HTTP请求(this.getUserByPostData
)的结果作为第一个请求结果的属性?
答案 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}}。