2017-10-06 125 views
2

我想用角度應用程序在我的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)。所以我想知道達到相同結果的方式是什麼(即第一次不要等待一秒鐘以獲得結果並在組件被破壞時停止發送請求)

回答

6

您可以使用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