簡體   English   中英

首先啟動IntervalObservable即時調用

[英]Start first call of IntervalObservable instant

我正在使用IntervalObservable來連續調用我的應用程序的服務器端。 我可以訂閱和取消訂閱Oberservable,一切正常,只有一個例外:

對服務器的第一次調用被延遲了,但我希望它是即時的。 IntervalObservable的行為原則上是正確的,但不符合我的要求。

@Injectable()
export class LoggerService {
  constructor(private http: Http) { }
  private apiURL = 'assets/file.json'; 

  getList() {
       return IntervalObservable.create(1000).flatMap(() 
       => this.http.get(this.apiURL))
      .map(this.extractData)
      .catch(this.handleError);
  }
  private extractData(res: Response) {
    var fooot = new Foo();
    fooot.fillFromJSON(JSON.stringify(res.json()));
    return fooot;
  }

  private handleError(error: any) {
    let errMsg = (error.message) ? error.message :
      error.status ? `${error.status} - ${error.statusText}` : 'Server error';
    console.error(errMsg);
    return IntervalObservable.throw(errMsg);
  }
}

那么如何在第一次通話時調用服務器,然后以定義的延遲調用服務器?

兩件事情,

  1. 您可以使用工廠方法而不是派生類型,即Observable.interval(3000)而不是IntervalObservable.create
  2. 您可以使用timer來代替單個操作員:

     return Observable.timer(0, 1000) .flatMapTo(this.http.get(this.apiURL)) .map(this.extractData) .catch(this.handleError); 

你可以使用startWith

以下示例在創建流時在流上推送事件:

 getList() {
    return IntervalObservable.create(1000)
     .startWith(1) // needs a value, but won't be used
     .flatMap(() => this.http.get(this.apiURL))
     .map(this.extractData)
     .catch(this.handleError);  
 }

我會使用concatconcatMap

觀看現場演示: http//plnkr.co/edit/4kdJRD7HZqrbce7MFPW7

import {Observable} from 'rxjs';

let httpRequest = () => Observable.of('response');

Observable.of(null)
  .concat(Observable.interval(3000))
  .concatMap(httpRequest)
  .subscribe((response) => console.log(response));

第一個請求是用Observable.of(null)觸發的,它通過運算符鏈並觸發httpRequest 然后全部由Observable.interval運算符決定。

對於#RxJS版本5+:

您可以使用rxjs interval運算符並實現輪詢。 以下實現將每1000毫秒間隔執行this.statusService.getStatus()行:

 getList() {
     return Observable.interval(1000).startWith(1)
     .mergeMapTo(this.http.get(this.apiURL))
     .catch(this.handleError);
}

現在,添加startWith(1) ,它將立即執行,沒有任何延遲,之后每隔1秒執行一次。 我想這就是你想要的。

或另一種方法:您可以使用計時器操作符並執行以下操作:

getList() {
    return Observable.timer(0, 1000)
      .mergeMapTo(this.http.get(this.apiURL))
      .catch(this.handleError);
}

在這種方法中,計時器操作員將立即執行,之后將每1000毫秒執行一次。

另外別忘了導入:

  import {Observable} from 'rxjs/Observable';
  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