【问题标题】:Nested Observables from nested http requests in AngularAngular中嵌套http请求的嵌套Observables
【发布时间】:2017-09-14 16:28:18
【问题描述】:

这就是我打算做的事情。

  • 请求https://reqres.in/api/users/2
  • 发送响应如下。

    {
      "data": {
        "id": 2,
        "first_name": "Janet",
        "last_name": "Weaver",
        "avatar":
          "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
      }
    }
    
    • 现在,我想获取头像 url 并发出另一个请求,这将给我图像二进制文件。

    • 最后,我想要的输出是一个 Observable,它给了我这些数据。

      {
        "data": {
          "id": 2,
          "first_name": "Janet",
          "last_name": "Weaver",
          "avatar":
            "BINARY_GIBBERISH HERE"
        }
      }
      

这是我接近但无法完成的方式。

this.http
  .get('https://reqres.in/api/users/2')
  .switchMap(a => {
    const image$ = this.http.get(a.json().data.avatar);
    const data = Observable.of(a.json().data);
    // Do something here to combine.
  })
  .subscribe(a => {
    // get data here.
  });
}

基本上,有没有办法有这样的结构,

{
  "data": {
    "id": 2,
    "first_name": "Janet",
    "last_name": "Weaver",
    "avatar": [Observable from this.http.get]
  }
}

然后哪个会被解析为我的最终数据?

【问题讨论】:

    标签: ajax angular rxjs angular2-observables


    【解决方案1】:

    您不需要为此使用switchMap,而是使用concatMapmergeMap

    this.http
      .get('https://reqres.in/api/users/2')
      .concatMap(a => {
        const data = a.json().data;
        const image$ = this.http.get(data.avatar);
    
        return image$.map(imageData => {
          data.avatar = imageData;
          return data;
        });
      })
      .subscribe(a => {
        // get data here.
      });
    }
    

    【讨论】:

    • 太棒了!非常感谢:)
    猜你喜欢
    • 2016-09-14
    • 2019-10-27
    • 1970-01-01
    • 2019-08-04
    • 2021-10-03
    • 2017-03-20
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多