RxJS有多个switchMap和map运算符...有更好的方法吗?

时间:2018-09-19 20:22:12

标签: rxjs rxjs-pipeable-operators

我对RxJS还是很陌生,想知道我是否做对了...在下面的ngOnInit()函数中,我得到了一个客户端对象,然后用管道将其发送...

下面是否有更好的方法来重复进行switchMap / map操作?

我的代码可以工作...但是我想知道是否应该采用一种更优雅的方法...

public client: Client;
public contract: Contract;      
public alreadyPendingContract: boolean;
public alreadyActiveContract: boolean;
public minimumStartDate: Date;
public minimumEndDate: Date;
public rolloverExclusionDate: Date;
public startDateFilter;

  ngOnInit() {
    this.clientService.getClient$().pipe(
      filter(client => client != null),
      map(client => this.client = client),
      pluck('client_id'),
      map((client_id: string) => {
        this.clientContractForm.get('client_id').setValue(client_id);
        return client_id;
      }),
      switchMap((client_id: string) => {
        return this.contractAddService.getAlreadyPendingContract$(client_id);
      }),
      map(alreadyPendingContract => {
        this.alreadyPendingContract = alreadyPendingContract;
        return this.client.client_id;
      }),
      switchMap((client_id: string) => {
        return this.contractAddService.getAlreadyActiveContract$(client_id);
      }),
      map(alreadyActiveContract => {
        this.alreadyActiveContract = alreadyActiveContract;
      }),
      switchMap(() => {
        return this.contractAddService.getMinimumStartDate$(this.client.client_id);
      }),
      map((minimumStartDate: IMinimumStartDate) => {
        this.minimumStartDate = minimumStartDate.minimumStartDate;
        this.rolloverExclusionDate = minimumStartDate.rolloverExclusionDate;
        this.startDateFilter = (m: Moment): boolean => {
          // Filters out the rollover exclusion day from being an available start date.
          return !moment.utc(m).isSame(moment.utc(this.rolloverExclusionDate), 'day');
        }
      })
    ).subscribe();
  }

1 个答案:

答案 0 :(得分:0)

我不确定这是否更优雅,但这是另一种选择

ngOnInit() {
    this.clientService.getClient$().pipe(
      filter(client => client != null),
      map(client => {
         this.client = client;
         this.clientContractForm.get('client_id').setValue(client_id);
         return client.client_id;
      },
      switchMap(client_id => this.doStuffWithClientId(client_id)),
      map((minimumStartDate: IMinimumStartDate) => {
        this.minimumStartDate = minimumStartDate.minimumStartDate;
        this.rolloverExclusionDate = minimumStartDate.rolloverExclusionDate;
        this.startDateFilter = (m: Moment): boolean => {
          // Filters out the rollover exclusion day from being an available start date.
          return !moment.utc(m).isSame(moment.utc(this.rolloverExclusionDate), 'day');
        }
      })
    ).subscribe();
  }

doStuffWithClientId(clientId: string) {
   return this.contractAddService.getAlreadyPendingContract$(client_id).pipe(
      tap(alreadyPendingContract => this.alreadyPendingContract = alreadyPendingContract),
      switchMap(() => this.contractAddService.getAlreadyActiveContract$(clientId)),
      tap(alreadyActiveContract => this.alreadyActiveContract = alreadyActiveContract),
      switchMap(() => this.contractAddService.getMinimumStartDate$(clientId)),
   )
}

我尚未测试代码,因此可能存在语法错误。不过,基本思想是将所有依赖于client_id的事物隔离到一个函数中,该函数接收 clientId 作为输入,并因此使其在整个函数中可见。