合并在RxJS/Angular 6中相互依赖的不同HTTP调用

Ste*_*n R 3 rxjs angular

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

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

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

this.postsService.getPostData(postId)
.switchMap(
  postData => Observable.forkJoin(this.getUserByPostData(postData))
)
.subscribe( result => console.log(result) );
Run Code Online (Sandbox Code Playgroud)

两个函数(getPostDatagetUserByPostData)都将返回Observableshttp.get

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

我怎样才能将结果合并?是否也可以将第二个HTTP request(this.getUserByPostData)的结果作为第一个请求结果的属性推送?

car*_*ant 8

如果第二请求从第一请求的响应取决于数据,如果你想将两种反应相结合,可以使用map中操作switchMap:

this.postsService.getPostData(postId).switchMap(
  postData => this.getUserByPostData(postData).map(
    userByPostData => ({ postData, userByPostData })
  )
).subscribe(({ postData, userByPostData })=> console.log(postData, userByPostData));
Run Code Online (Sandbox Code Playgroud)

另外,如果可观察到的由返回的getPostData是基于HTTP的,它只会发出过一次,所以绝不会有任何需要切换.你可以使用mergeMap,而不是.