如何防止在get操作中嵌套订阅?

时间:2020-11-01 05:24:27

标签: typescript rxjs angular2-observables

我从对象和图像中获取数据,这是代码:

  this.getObjects(id)
  .subscribe(param => param.results.map(r=> this.getImmagesByObjectId(r.id)
    .subscribe(data=>console.log(data, param))))
如您所见,

我首先获取对象和内部可观察对象 基于对象ID,我获取了对象图像。

我尝试防止嵌套的订阅,为此,我尝试使用merge all运算符:

  this.getObjects(id).pipe(mergeMap
  (param => param.results.map(r=> this.getImmagesByObjectId(r.id))
    .subscribe(data=>console.log(data, param))))
  

但是上面的代码不起作用。

我的问题是如何从服务器获取对象和图像并防止嵌套订阅?

更新:

这是GetObjects实现,您可以看到它可观察到:

  getObjects(Id: string): Observable<Response<MyObjects[]>> {
    return this.clientObjects.get<Response<MyObjects[]>>(environment.baseUrl + '/main/myobjects/byobjid', {
      params: {
        id: Id
      }
    });
  }

1 个答案:

答案 0 :(得分:0)

这可以通过使用flatMap(别名为mergeMap)和from运算符来实现

this.getObjects(id)
  .flatMap(param => from(param.results)) // `from` to convert array to observable
  .flatMap(result => this.getImmagesByObjectId(result.id)
  .subscribe(data => console.log(data)))) // data contains image

或者,如果我们想在param方法的console.log中看到subscribe

this.getObjects(id)
  .flatMap(param => { 
    return from(param.results)
      .pipe(
        flatMap(result => this.getImmagesByObjectId(result.id))
        map(image => ({image, param})) // return both image and param as object
      )
  ))   
  .subscribe(data => console.log(data.image, data.param))))