繁体   English   中英

使用angular和rxjs实现轮询

[英]Implement polling with angular and rxjs

我想用角度应用程序在我的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的间隔,但是例如当我写IntervalObservable.takeWhile它不再存在时(rxjs)版本5.4.3)。 所以我想知道实现相同结果的方式是什么(即第一次不等待一秒钟来获取结果并在组件被销毁时停止发送请求)

您可以使用rxjs interval运算符并实现轮询。 以下实现将每1000毫秒间隔执行this.statusService.getStatus()行:

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

更新:添加startWith(1) ,现在,它将立即执行,没有任何延迟,之后每隔1秒执行一次。 我想这就是你想要的。

或另一种方法:您可以使用计时器操作符并执行以下操作:

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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM