我在三个地方进行API调用(编号为(1),(2),(3))。
console.log(this.sanitizer.bypassSecurityTrustHtml(this.unsafe));
我在其他代码中也使用了switchmap
getCMPortsMapping(siteRef: string) {
Object.keys(cmBoardPortsEnum).forEach(port => {
let queryParams = "output and system and enabled and config and " + cmBoardPortsEnum[port];
let cmBoardPortsMappings = new CMBoardPortsMappings("", "", false, "", "");
// ------- (1) --------
this.siteService.getDetailsBySiteRef(queryParams, siteRef).subscribe(portsDetail => {
if (portsDetail && portsDetail.rows.length > 0) {
cmBoardPortsMappings.type = cmBoardPortsEnum[port];
//Check if port is enabled ------ (2) --------
this.siteService.getWritablePointData(this.helperService.parseRef(portsDetail.rows[0].id)).subscribe(portEnable => {
if (portEnable && portEnable.rows.length) {
//got data for port
if (portEnable.rows[0] && portEnable.rows[0].val) {
//got port enable/disbale
let val = this.helperService.TypeMapping(portEnable.rows[0].val)
switch (val) {
case "1.0":
cmBoardPortsMappings.isEnabled = true;
//Get the port mapping
let mappingQuery = "system and cmd and " + cmBoardPortsEnum[port];
// ----------- (3) -----------
this.siteService.getDetailsBySiteRef(mappingQuery, siteRef).subscribe(mappingDetails => {
if (mappingDetails && mappingDetails.rows.length) {
mappingDetails.rows[0].dis.split("SystemEquip-")[1] != "" ? cmBoardPortsMappings.mapping = mappingDetails.rows[0].dis.split("SystemEquip-")[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, "")
}
}
else {
throw new Error("In correct port mapping read from haystack")
}
});
break;
case "0.0":
cmBoardPortsMappings.isEnabled = false;
cmBoardPortsMappings.mapping = "";
break;
default:
throw new Error("In correct port val read from haystack")
}
this.cmBoardPortsMappingsCollection.set(cmBoardPortsEnum[port], cmBoardPortsMappings);
}
}
});
}
});
});
}
我应该使用this.siteService.getFloorRooms(this.floorRef).pipe(
switchMap(res => {
const rest = res
let elementId = [];
res.rows.forEach((element) => {
elementId.push(element.id)
});
for (const color of elementId) {
this.roomref = (color).split(":")[1].split(" ")[0];
}
return this.siteService.checkPairedRooms(this.roomref)
})
).subscribe(m => {
this.rooms = m.rows;
if (m.rows.length == 1) {
this.paired = true;
}
this.getExistingFloorPlan();
});
,mergemap
,concatmap
吗?实施它的正确方法是什么?正如某人指出的那样,switchmap内的foreach将不会返回,因此使用switchmap
和其他实用程序会有所帮助,但我没有使用过这些rxjs实用程序功能。
答案 0 :(得分:1)
是否对http请求使用mergemap
,concatmap
,switchmap
并不重要,因为它们仅发出一次且完整。
创建一个串联的http请求数组,将每个请求映射到下一个请求,将最后一个映射到所需的输出。然后将该数组传递到forkJoin
。享受。
getCMPortsMapping(siteRef: string) {
forkJoin(Object.keys(cmBoardPortsEnum).map(port => {
let queryParams = "output and system and enabled and config and " + cmBoardPortsEnum[port];
return this.siteService.getDetailsBySiteRef(queryParams, siteRef).pipe(
filter(portsDetail => portsDetail && portsDetail.rows.length > 0),
switchMap(portsDetail => this.siteService.getWritablePointData(this.helperService.parseRef(portsDetail.rows[0].id))),
filter(portEnable => portEnable && portEnable.rows.length && portEnable.rows[0] && portEnable.rows[0].val),
switchMap(portEnable => {
const cmBoardPortsMappings = new CMBoardPortsMappings("", "", false, "", "");
cmBoardPortsMappings.type = cmBoardPortsEnum[port];
const val = this.helperService.TypeMapping(portEnable.rows[0].val)
switch (val) {
case "1.0":
cmBoardPortsMappings.isEnabled = true;
return enrichCmBoardPortsMappings(cmBoardPortsMappings, siteRef);
case "0.0":
cmBoardPortsMappings.isEnabled = false;
cmBoardPortsMappings.mapping = "";
return of(cmBoardPortsMappings);
default:
return throwError('In correct port val read from haystack');
}
})
)
})).subscribe(cmBoardPortsMappingsArray => cmBoardPortsMappingsArray.forEach(cmBoardPortsMappings =>
this.cmBoardPortsMappingsCollection.set(cmBoardPortsMappings.type, cmBoardPortsMappings)
));
}
enrichCmBoardPortsMappings(cmBoardPortsMappings: CMBoardPortsMappings, siteRef: string): Observable<CMBoardPortsMappings> {
let mappingQuery = "system and cmd and " + cmBoardPortsMappings.type;
return this.siteService.getDetailsBySiteRef(mappingQuery, siteRef).pipe(
tap(mappingDetails => {
if(!(mappingDetails && mappingDetails.rows.length)) throw new Error('In correct port mapping read from haystack') ;
}),
map(mappingDetails => {
if (mappingDetails.rows[0].dis.split("SystemEquip-")[1] != "") {
cmBoardPortsMappings.mapping = mappingDetails.rows[0].dis.split("SystemEquip-")[1];
}
if (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, "")
}
return cmBoardPortsMappings;
})
)
}