可观察无法最终从错误状态传入



不是第一次遇到这个问题了。因为我想在网页上显示一些数据,即使http请求失败,我在err状态内也有一些逻辑。为了不重复subscribeerr中的代码,我使用在complete/finally状态中编写代码。

this.loadingResults = true;
this.service.get().subscribe(data => {
// do something with the data
}, err => {
this.initializeData();
}, () => {
this.loadingResults = false;
this.cd.detectChanges(); 
});

因为在页面中我使用了一个旋转器来等待响应,当它来的时候(成功与否,在subscribeerr上),我想将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回调函数errorcomplete互斥。如果一个被触发,另一个就不会被触发。相反,您可以使用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();
}
);

同样奇怪的是,为什么要手动触发变更检测?是什么阻止它自动触发?

相关内容

  • 没有找到相关文章

最新更新