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

问题描述

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

  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
      }
    });
  }

解决方法

这可以通过使用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))))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...