如何使用rxjs进行后续调用

时间:2019-08-07 19:34:48

标签: angular rxjs

我在三个地方进行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(); }); mergemapconcatmap吗?实施它的正确方法是什么?正如某人指出的那样,switchmap内的foreach将不会返回,因此使用switchmap和其他实用程序会有所帮助,但我没有使用过这些rxjs实用程序功能。

1 个答案:

答案 0 :(得分:1)

是否对http请求使用mergemapconcatmapswitchmap并不重要,因为它们仅发出一次且完整。

创建一个串联的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;
    })
  )
}