使用angular和rxjs实现轮询

Axe*_*xel 2 rxjs typescript 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);
}
Run Code Online (Sandbox Code Playgroud)

然后我想挂起这个服务并向服务器发送请求.在我组件的组件中,我有以下代码:

IntervalObservable.create(1000).subscribe(() => {
            this.statusService.getStatus()
                .subscribe(
                (next) => {
                    this.state = next;
                };
        });
Run Code Online (Sandbox Code Playgroud)

我试图实现我在这里阅读的解决方案,它处理相同的问题(但它是差不多2年前的帖子)Angular2 http在一个时间间隔,但是例如当我写IntervalObservable.takeWhile时它不再存在(rxjs)版本5.4.3).所以我想知道实现相同结果的方式是什么(即第一次不等待一秒钟获取结果并在组件被销毁时停止发送请求)

asm*_*mud 10

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

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

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

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

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

在这种方法中,计时器操作员将立即执行,之后将每1000毫秒执行一次.

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

  ngOnDestroy(){
     this.subscription.unsubscribe();
  }
Run Code Online (Sandbox Code Playgroud)

另外别忘了导入:

  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';
Run Code Online (Sandbox Code Playgroud)