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 },

我发现自己在Typescript和RXJS中使用了以下模式:

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
和其他可观察函数使用承诺返回投影,因此您可以明确地混合和匹配。