Typescript RxJS处理闭包变量

Typescript RxJS处理闭包变量,typescript,rxjs,reactive,Typescript,Rxjs,Reactive,我的设想如下: -访问某个对象的数据库 -获取基本对象后,获取其附加数据 -将其他数据合并到基础对象 我希望以纯功能性的方式编写(即没有副作用),但到目前为止我无法实现: getMeterPointWithMeterDatabyId(id: number, allowEmpty: boolean = false): Observable<MergeObject> { const params = this.getEmptyParams(); let mp: Merge

我的设想如下: -访问某个对象的数据库 -获取基本对象后,获取其附加数据 -将其他数据合并到基础对象

我希望以纯功能性的方式编写(即没有副作用),但到目前为止我无法实现:

getMeterPointWithMeterDatabyId(id: number, allowEmpty: boolean = false): Observable<MergeObject> {
    const params = this.getEmptyParams();
    let mp: MergeObject; // This is my enclosed objects I refer to

    return this.masterService.getMasterById(params)
    .concatMap<MergeObject, MergeData[]>((master: MergeObject) => {
      mp = master; // This is side effect generation
      return this.meterService.getMasterData(params);
    })
    .concatMap<MasterData[], MergeObject>((md: MasterData[]) => {
      mp.data = md.slice(); // Even more side effects
      return Observable.of(mp); // Final result generated form impure result
    });
getMeterPointWithMeterDatabyId(id:number,allowEmpty:boolean=false):可观察{
const params=this.getEmptyParams();
let mp:MergeObject;//这是我引用的封闭对象
返回此.masterService.getMasterById(参数)
.concatMap((主控:合并对象)=>{
mp=master;//这是副作用生成
返回此.meterService.getMasterData(参数);
})
.concatMap((md:MasterData[])=>{
mp.data=md.slice();//还有更多的副作用
返回可观察的。of(mp);//由不纯结果生成的最终结果
});
我想我对对象之间没有循环依赖关系时Rx的工作原理有一个ggo的理解(即我的调用链生成了a->B->C),但当我需要在一个处理步骤中后退一步以获取一些以前的数据(即a->B->a,其中a最终包含B)时,我失去了信心


编辑:据si所知,
zip
操作员正在执行此操作,但我想知道,如果您确实需要基本对象来查询详细信息(即,请求必须连续发生),是否可以手动执行此操作

this.service.getMaster(id)
.switchMap(master=>this.service.getDetails(master)
//.catch(…)合并(主控、明细))
)
.subscribe();
诀窍是简单地将
map
嵌套在
switchMap
中,这样
master
就可以保持在范围内,而无需跳转

如果details请求实际上是独立的,那么可以使用

Observable.forkJoin(
此.service.getMaster(id),
this.service.getDetails(id)
//.catch(…)合并(主控、明细))
.subscribe();

使操作员链去线性化的技术,即转换

源代码$
.switchMap(数据1=>transformationA(数据1))
//从这里开始,您只能看到数据1
.switchMap(数据2=>transformationB(数据2))
//从这里开始,您只能看到数据2
.订阅(数据3=>…);
进入

源代码$
.switchMap(数据1=>transformationA(数据1)
.switchMap(数据2=>transformationB(数据2)
//您可以在这里看到data1和data2!
)
.订阅(数据3=>…);

为了将来自多个步骤的数据保留在范围内,例如组合它们,通常非常有用。这绝对是一件需要时刻记住的事情:您也可以嵌套。

我明白您的观点,但有一个问题:
switchMap
的使用是否至关重要?或者实际上顶级操作符可以是任何类型(
concatMap
mergeMap
e.c.t)?除此之外,启动获取的数据的内部级处理是很聪明的。我将在项目中使用它,谢谢!对于HTTP请求,只有在switchMap和mergeMap之间没有明显区别时才会触发。我倾向于选择switchMap,因为在大多数情况下,某些触发器映射到请求,其行为就是您想要的(也就是说,取消订阅内部可观察对象,而不是将它们合并在一起)。