问题描述
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))))