用多个异步HTTP请求构建管道

时间:2019-05-28 07:39:06

标签: angular rxjs angular-httpclient

我需要发出第一个HTTP请求并从对象的响应数组中获取。 然后,我需要对数组中的每个对象(可能在循环中)发出HTTP请求,以获取更多信息。所有这些都在Angular内部。我尝试使用管道,但有一些困难。

2 个答案:

答案 0 :(得分:0)

您的解释非常模糊,没有伪代码示例或您尝试执行的实际示例,这很难回答。

但是我收集到的是您需要的:

API调用1:

{ ids: [1, 2, 3] }

API调用2获得一个ID(api(1),api(2),api(3)等)并返回:

{ something: 'else', id: 1 }

在RxJS中,您希望为每个获得的ID switchMap,以便将订阅切换到新的Observable。如果您希望所有这些都在它们进入时进入,则可以merge。如果您希望它们按可预期的方式进入,那么您可以concat

基本示例:

this.http.get<{id: number[]}>('api1').pipe(
   switchMap(ids => {
      return concat(ids.forEach(id => {
           return this.http.get<{ something: string, id: number}>('api2/' + id)
      })
   }).subscribe(console.log)

答案 1 :(得分:0)

基本上,您可以通过将值从内部Observable中拉出并将其传递回父流来对嵌套的api调用使用mergeMap / flatMap。

就像下面答案中的示例一样,如果您必须先进行嵌套调用以获取用户,然后再获取用户的偏好,则可以使用以下平面图。

ngOnInit() {
    this.userService.getUser().pipe(
        tap(u => this.user = u),
        flatMap(u => this.userService.getPreferences(u.username))
      ).subscribe(p => this.preferences = p);
}

How to make nested Observable calls in Angular2