假设我有以下来源:
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
调用。它可以工作,但是我感觉它可以通过其他一些更优雅的方式来完成……可以重构吗?不要建议将此逻辑转移到后端,在我看来,这是不可能的。
答案 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();
});
}