不是第一次遇到这个问题了。因为我想在网页上显示一些数据,即使http请求失败,我在err
状态内也有一些逻辑。为了不重复subscribe
和err
中的代码,我使用在complete
/finally
状态中编写代码。
this.loadingResults = true;
this.service.get().subscribe(data => {
// do something with the data
}, err => {
this.initializeData();
}, () => {
this.loadingResults = false;
this.cd.detectChanges();
});
因为在页面中我使用了一个旋转器来等待响应,当它来的时候(成功与否,在subscribe
或err
上),我想将loadingResults
的值更改为false,并使用ChangeDetectorRef
来刷新页面上的数据。
问题是上面的代码不能正常工作,我需要放弃在finally
函数:
this.loadingResults = true;
this.service.get().subscribe(data => {
// do something with the data
this.loadingResults = false;
this.cd.detectChanges();
}, err => {
this.initializeData();
this.loadingResults = false; // duplicate
this.cd.detectChanges(); // duplicate
});
使用finally并避免在其他响应类型中重复代码的最佳方法是什么?我看到它的行为不像try-catch-finally
从后端(Java/c#)
subscribe
回调函数error
和complete
互斥。如果一个被触发,另一个就不会被触发。相反,您可以使用finalize
操作符。它将在完成或错误的情况下被触发。
this.loadingResults = true;
this.service.get().pipe(
finalize(() => {
this.loadingResults = false;
this.cd.detectChanges();
})
).subscribe(
data => {
// do something with the data
},
err => {
this.initializeData();
}
);
同样奇怪的是,为什么要手动触发变更检测?是什么阻止它自动触发?