使用angular和rxjs实现轮询

时间:2017-10-06 09:20:20

标签: angular typescript rxjs nativescript

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

@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.takeWhile时它并没有& #39; t不再存在(rxjs版本5.4.3)。所以我想知道实现相同结果的方法是什么(即第一次不等待一秒钟来获得结果并在组件被销毁时停止发送请求)

1 个答案:

答案 0 :(得分:8)

您可以使用rxjs interval operator并实施投票。以下实现将每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';