使用角度和rxjs实现轮询

使用角度和rxjs实现轮询

问题描述:

我想用角度应用程序在我的nativescript中实现轮询。我想每秒钟检查一下我的后端服务器的状态。我有这项服务:使用角度和rxjs实现轮询

@Injectable() 
export class StateService { 
getStatus(): Observable<StateApp> { 
     let headers = this.getHeaders(); 
     return this.http 
      .get(BackendService.stateUrl, { 
       headers: headers 
      }) 
      .map(res => { 
       return res.json() as StateApp 
      }) 
      .catch(this.handleErrors); 
} 

然后我想推测这个服务并发送请求到服务器。在我在我的组件组件我有以下代码:

IntervalObservable.create(1000).subscribe(() => { 
      this.statusService.getStatus() 
       .subscribe(
       (next) => { 
        this.state = next; 
       }; 
     }); 

我想实现我在这里阅读解决方案,并具有相同问题涉及(但它是从近2年前后)Angular2 http at an interval但实例当我写IntervalObservable.take时,它不再存在(rxjs版本5.4.3)。所以我想知道达到相同结果的方式是什么(即第一次不要等待一秒钟以获得结果并在组件被破坏时停止发送请求)

您可以使用rxjs interval operator并实施轮询。下面FPGA实现将在每1000毫秒间隔执行this.statusService.getStatus()行:

this.subscription = Observable.interval(1000).startWith(1) 
.mergeMap(() => this.statusService.getStatus()) 
.subscribe((next) => { 
    this.state = next; 
}) 

更新:startWith(1)加入,现在,它会立即没有任何延迟执行,之后,它将每1秒的时间间隔执行。 我认为这是你想要的。

或另一种作法:可以使用timer operator并执行以下操作:

this.subscription = Observable.timer(0, 1000) 
    .mergeMapTo(this.statusService.getStatus()) 
    .subscribe((next) => { 
     this.state = next; 
    }, (errRes)=>{ 
     console.log(errRes); 
    }); 

在这种方法中,定时器操作会立即执行后,将在每1000毫秒执行。

并取消订阅Observable组件ngOnDestroy生命周期钩子。

ngOnDestroy(){ 
    this.subscription.unsubscribe(); 
    } 

也不要忘记导入:

import {Observable} from 'rxjs/Observable'; 
    import 'rxjs/add/operator/mergeMap'; 
    import 'rxjs/add/operator/startWith'; 
    import 'rxjs/add/operator/mergeMapTo'; 
    import 'rxjs/add/observable/timer'; 
+0

谢谢你的答案,你的解释它的工作:) – Axel