Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何使用rxjs进行后续调用_Angular_Rxjs - Fatal编程技术网

Angular 如何使用rxjs进行后续调用

Angular 如何使用rxjs进行后续调用,angular,rxjs,Angular,Rxjs,我在三个地方进行API调用(我已将其编号为(1)、(2)、(3)) getCMPortsMapping(siteRef:string){ Object.keys(cmBoardPortsEnum).forEach(端口=>{ 让queryParams=“输出和系统以及启用和配置”和“+cmBoardPortsEnum[端口]; 设cmBoardPortsMappings=新的cmBoardPortsMappings(“,”,false,”,”); // ------- (1) --------

我在三个地方进行API调用(我已将其编号为(1)、(2)、(3))

getCMPortsMapping(siteRef:string){
Object.keys(cmBoardPortsEnum).forEach(端口=>{
让queryParams=“输出和系统以及启用和配置”和“+cmBoardPortsEnum[端口];
设cmBoardPortsMappings=新的cmBoardPortsMappings(“,”,false,”,”);
// ------- (1) --------
this.siteService.getDetailsBySiteRef(queryParams,siteRef).subscribe(portsDetail=>{
if(portsDetail&&portsDetail.rows.length>0){
cmBoardPortsMappings.type=cmBoardPortsEnum[端口];
//检查端口是否启用------(2)--------
this.siteService.getWritablePointData(this.helperService.parseRef(portsDetail.rows[0].id)).subscribe(portEnable=>{
if(portEnable&&portEnable.rows.length){
//获取端口的数据
if(portEnable.rows[0]&&portEnable.rows[0].val){
//已启用/取消分配端口
让val=this.helperService.TypeMapping(portEnable.rows[0].val)
开关(val){
案例“1.0”:
cmBoardPortsMappings.isEnabled=true;
//获取端口映射
让mappingQuery=“系统和cmd”和“+cmBoardPortsEnum[端口];
// ----------- (3) -----------
this.siteService.getDetailsBySiteRef(mappingQuery,siteRef).subscribe(mappingDetails=>{
if(mappingDetails&&mappingDetails.rows.length){
mappingDetails.rows[0].dis.split(“SystemEquipment-”[1]!=“”?cmBoardPortsMappings.mappingDetails.rows[0].dis.split(“SystemEquipment-”)[1]:“”;
this.helperService.parseRef(mappingDetails.rows[0].id)!=“”?cmBoardPortsMappings.ref=this.helperService.parseRef(mappingDetails.rows[0].id):“”;
if(cmBoardPortsMappings.mapping!=“”){
cmBoardPortsMappings.param=cmBoardPortsMappings.mapping.toLowerCase().replace(/\s/g,“”)
}
}
否则{
抛出新错误(“在从haystack读取的正确端口映射中”)
}
});
打破
案例“0.0”:
cmBoardPortsMappings.isEnabled=false;
cmBoardPortsMappings.mapping=“”;
打破
违约:
抛出新错误(“在从haystack读取的正确端口val中”)
}
此.cmBoardPortsMappings集合.set(cmBoardPortsEnum[port],cmBoardPortsMappings);
}
}
});
}
});
});
}
我在其他代码中也使用了switchmap

this.siteService.getFloorRooms(this.floorRef).pipe(
开关映射(res=>{
常数rest=res
设elementId=[];
res.rows.forEach((元素)=>{
elementId.push(element.id)
});
for(元素ID的常量颜色){
this.roomref=(颜色).split(“:”[1]。split(“”[0];
}
返回此.siteService.checkPairedRooms(this.roomref)
})
).订阅(m=>{
这个房间=m行;
如果(m.rows.length==1){
this.paired=true;
}
这个.getExistingFloorPlan();
});

我应该使用
mergemap
concatmap
switchmap
?正确的实施方法是什么?正如有人指出的,foreach inside switchmap不会返回,因此使用
forkjoin
和其他实用程序会有所帮助,但我没有使用这些rxjs实用程序功能。

无论您是否使用http请求的
mergemap
concatmap
switchmap
,因为它们只发射一次,而且是完整的

创建一个连接http请求的数组,将每个请求映射到下一个请求,并将最后一个请求映射到所需的输出。然后将该数组传递给
forkJoin
。享受

getCMPortsMapping(siteRef:string){
forkJoin(Object.keys(cmBoardPortsEnum.map)(端口=>{
让queryParams=“输出和系统以及启用和配置”和“+cmBoardPortsEnum[端口];
返回此.siteService.getDetailsBySiteRef(queryParams,siteRef).pipe(
筛选器(portsDetail=>portsDetail&&portsDetail.rows.length>0),
switchMap(portsDetail=>this.siteService.getWritablePointData(this.helperService.parseRef(portsDetail.rows[0].id)),
筛选器(portEnable=>portEnable&&portEnable.rows.length&&portEnable.rows[0]&&portEnable.rows[0].val),
开关映射(可移植=>{
const cmBoardPortsMappings=新的cmBoardPortsMappings(“,”,false,“,”);
cmBoardPortsMappings.type=cmBoardPortsEnum[端口];
const val=this.helperService.TypeMapping(可移植的.rows[0].val)
开关(val){
案例“1.0”:
cmBoardPortsMappings.isEnabled=true;
返回enrichCmBoardPortsMappings(cmBoardPortsMappings,siteRef);
案例“0.0”:
cmBoardPortsMappings.isEnabled=false;
cmBoardPortsMappings.mapping=“”;
返回(cmBoardPortsMappings);
违约:
返回投掷器(“从haystack读取的正确端口val”);
}
})
)
})).subscribe(cmBoardPortsMappingsArray=>cmBoardPortsMappingsArray.forEach(cmBoardPortsMappings=>
此.cmBoardPortsMappings集合.set(cmBoardPortsMappings.type,cmBoardPortsMappings)
));
}
enrichCmBoardPortsMappings(cmBoardPortsMappings:cmBoardPortsMappings,siteRef:string):可观察{
让mappingQuery=“system and cmd”和“+cmBoardPortsMappings.type;
返回此.siteService.getDetailsBySiteRef(mappingQuery,siteRef).pipe(
轻触(映射详细信息=>{
if(!(mappingDetails&&mappingDetails.rows.length))抛出新错误('In correct port mapping read from haystack');
}),
地图(mappingDetails=>{
if(mappingDetails.rows[0].dis.split(“SystemEquipment-”)[1]!=“”){
cmBoardP