取消订阅不适用于打字稿中的订阅间隔

时间:2019-09-26 19:49:11

标签: angular typescript

我正在订阅时间间隔,如果出错,则该时间间隔应取消订阅。同样在ngDestroy上,它应该取消描述。但是,当我转到网站上的另一个组件时,仍然可以看到它在哪里轮询服务器。

使用rxjs 6.2.1

这是我的代码

private polling: Subscription;

ngOnDestroy() {
    if(this.polling){    
    this.polling.unsubscribe();
    }
  }

 loadContacts(){
    this.polling = interval(10000)
                .subscribe((val) => {
                  this.resourceService.getQueryUserPresence(this.contacts[0].Email).subscribe((response) => {
                    console.log('polling for ' + fullName);                    
                  }, (error: any)=> {
                    console.log('Error Getting Status:  ' + error)
                    if(this.polling){
                      this.polling.unsubscribe();
                      }
                  });
                }, (error: any)=> {
                  console.log('Error polling:  ' + error)
                  if(this.polling){
                    this.polling.unsubscribe();
                    }
                })
}

1 个答案:

答案 0 :(得分:1)

根据我对此SO post的了解,无需取消订阅即可,只要出现可观察的错误完成

我认为代码中的错误是您在第一个订阅处理程序中订阅了该请求,这就是为什么您无法在第二次看到错误的原因回调

就像有这样的事情

interval(1000)
 .subscribe(
  () => {}, 
  () => { console.log('I will never be able to catch an error just from an observable that emits values at certain interval!') }
)

解决此问题的一种方法是将 API调用放在pipeable operator中,例如switchMapmergeMapexhaustMap,{{1 }},具体取决于您的用例。
(上述运算符也称为high-order operators)。

concatMap

编辑

  

开始轮询,但仅当this.contacts.length> 0时才进入webAPI调用

我认为您可以使用skipWhile运算符。

this.polling = interval(1000)
 .pipe(
  mergeMap(() => this.resourceService.getQueryUserPresence(this.contacts[0].Email))
 )
 .subscribe(
  response => console.log('polling operation successful!', response),
  err => console.log('error caught from the API call!', err)
 )