我正在订阅时间间隔,如果出错,则该时间间隔应取消订阅。同样在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();
}
})
}
答案 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中,例如switchMap
,mergeMap
,exhaustMap
,{{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)
)