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并使用观察者传递消费者旁边的错误
你认为有什么方法可以改善这个吗?使用任何其他可观察的方法或模式
答案 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()
返回结果。