Typescript RXJS订阅完成模式
我发现自己在Typescript和RXJS中使用了以下模式:Typescript RXJS订阅完成模式,typescript,rxjs,observable,Typescript,Rxjs,Observable,我发现自己在Typescript和RXJS中使用了以下模式: httpCall() : Observable<string> {...} // set loading = true httpCall.subscribe( (p) => { // do stuff; }, (error)=> { // display error // set loading = false },
httpCall() : Observable<string> {...}
// set loading = true
httpCall.subscribe(
(p) => {
// do stuff;
},
(error)=> {
// display error
// set loading = false
},
() => {
// set loading = false
});
httpCall():可观察的{…}
//设置加载=真
httpCall.subscribe(
(p) =>{
//做事;
},
(错误)=>{
//显示错误
//设置加载=假
},
() => {
//设置加载=假
});
有没有办法防止双重调用
//set load=false
?使用“do”操作符
httpCall.do((data) => {
// Do smth
}).subscribe...
Cartant的建议很好,但您也可以通过重构到改进的设计来解决这个问题
const stopLoading = () => {
this.loading = false;
};
const error = (error: any) => {
// display error
stopLoading();
};
const next = value => { ... };
httpCall.subscribe({next, error, complete: stopLoading});
注意:
因为我是一个脾气暴躁的人,我会注意到,正如我已经做过无数次的那样,使用可观察对象来表示HTTP请求,对于Angular来说是一个糟糕的设计,并使生活变得不必要的复杂。它们只返回一个值,这使得它们在90%的时间内都是一个丑陋的不匹配
它还剥夺了我们可爱的异步
/等待
功能,将我们推回回调地狱
这让我很生气
下面是我要做的:
import 'rxjs/add/operator/toPromise';
export default class {
async ngOnInit() {
try {
this.data = await httpCall().toPromise();
}
catch (e) {
console.error(e);
}
finally {
this.loading = false;
}
}
}
强烈地考虑这一点,对于90%的HTTP方案来说,它比RXJS代码简单10X,可维护性的优点对任何人来说都是非常清楚的。
确切的问题是什么?看看<代码>最后的<代码>(如果你使用补丁操作器)或者<代码>最终化(如果你使用PiPEBER运算符)@Cartant-该块是否在try{}finally{}块内?实际上点击
如果你指的是现代的RXJ(当然,如果你可以称之为现代的:D),这是一个好主意,但不会起作用,因为OP只希望在任何终止事件中调用它。这将为每个发出的值调用它,而不是terminalsAh,最后是一个用例!httpCall.materialize().do(x=>{if(x.kind=='E'| | x.kind==='C')//do smth}.dematerialize().subscribebew在我的视频课程中了解更多关于materialize的内容:我完全同意您的这一具体的适度要求,但是在复杂场景中通过几个操作符来传递HTTP响应将创建异步/等待地狱。RxJS和Async/Await完全可以协同工作。不要选择其中一个,而是根据自己的需要学习如何使用这两个选项。祝你好运@安德烈拉杜列斯库绝对会学习这两者,如果不是为了学习的话。Rx是一个有能力的程序员应该能够学习的东西。然而,我认为当用例清晰明了时,学习起来更容易。还值得注意的是,flatMap
和其他可观察函数使用承诺返回投影,因此您可以明确地混合和匹配。