有可能以更优雅的方式将多个可观测对象与条件结合起来吗?

时间:2019-02-02 11:38:38

标签: angular rxjs

假设我有以下来源:

ngOnInit(): void {
  this._reloadData().pipe(finalize(() => { "do some work at the end"; })).subscribe(() => {});
}

private _reloadData(): Observable<{}> {
  return new Observable(observer => {
    if (confition1) {
      this.service1.getData().subscribe(data1 => {
        if (data1.Property1) {
          this.service2.getData().subscribe(data2 => {
            this.data = this.processData2(data2);
            observer.next();
            observer.complete();
          }, error => {
            observer.error(error);
            observer.complete();
          })
        } else {
          this.service3.getData().subscribe(data3 => {
            this.data = this.processData3(data3);
            observer.next();
            observer.complete();
          }, error => {
            observer.error(error);
            observer.complete();
          });
        }
      }, error => {
        observer.error(error);
        observer.complete();
      });
    } else {
      this.service4.getData().subscribe(data4 => {
        this.data = this.processData4(data4);
        observer.next();
        observer.complete();
      }, error => {
        observer.error(error);
        observer.complete();
      });
    }
  });
}

在这段代码中,有几个令人讨厌的地方,并且大多数是observer.errorobserver.nextobserver.complete调用。它可以工作,但是我感觉它可以通过其他一些更优雅的方式来完成……可以重构吗?不要建议将此逻辑转移到后端,在我看来,这是不可能的。

1 个答案:

答案 0 :(得分:1)

您可以将_reloadData()函数划分为多种方法并给出有意义的名称

private _reloadData(): Observable<{}> {
    return new Observable(observer => {
      if (confition1) {
        this._condition1(observer);
      } else {
        this._condition2(observer);
      }
    }
}

您不应在每个块中都调用observer.complete(),而应在调用api时仅使用一次(使用订阅的第三部分)

private _condition2(observer){
 this.service2.getData().subscribe(data2 => {
      this.data = this.processData2(data2);
      observer.next();
    }, error => {
      observer.error(error);
    }, () => {
      observer.complete();
    });
}