Можно ли комбинировать несколько наблюдаемых с условиями более элегантным способом? - PullRequest
0 голосов
/ 02 февраля 2019

Предположим, у меня есть следующие источники:

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.error, observer.next и observer.complete.Это работает, но у меня есть ощущение, что это может быть сделано каким-то другим, более элегантным способом ... Можно ли его реорганизовать?Не предлагайте переносить эту логику на сервер, в моем случае это невозможно.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете разделить функцию _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();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...