如何优化Observables函数中的观察者数量?

时间:2018-04-18 12:57:01

标签: angular observable observers

return new Observable(observer => {
  this.isLocationEnabled()
      .subscribe(
        isEnabled => {
          if(isEnabled) {
            observer.next(true);
          } else {
            this.resolveRequestLocationEnable() //notice this duplicate method
                .subscribe(
                  success => observer.next(success),
                  error => observer.error(error)
                );
          }
        },
        error => {
          this.resolveRequestLocationEnable() //notice this duplicate method
              .subscribe(
                success => observer.next(success),
                error => observer.error(error)
              );
        }
      );
}).first();

这是一个大函数的例子,它返回一个Observable并使用观察者传递消费者旁边的错误

你认为有什么方法可以改善这个吗?使用任何其他可观察的方法或模式

1 个答案:

答案 0 :(得分:0)

嵌套订阅块是反模式。它可以简单得多。试试这个:

 import { of } from 'rxjs/observable/of';
 import { catchError, mergeMap } from 'rxjs/operators';

 this.isLocationEnabled().pipe(
  catchError(() => of(true)),
  mergeMap(isEnabled => isEnabled 
    ? of(true) 
    : this.resolveRequestLocationEnable()
);

catchError运算符会忽略来自isLocationEnabled流的错误,并继续进行resolveRequestLocationEnable()调用,因为您希望在出现错误和成功的情况下调用该方法。

如果isEnabled为真,我们会立即返回of(true)。如果结果为假,我们会从resolveRequestLocationEnable()返回结果。