首先启动IntervalObservable即时调用

Akk*_*ekt 5 rxjs typescript rxjs5 angular

我正在使用a 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

那么如何在第一次通话时调用服务器,然后以定义的延迟调用服务器?

pau*_*els 9

两件事情,

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


mah*_*lst 5

你可以使用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);  
 }
Run Code Online (Sandbox Code Playgroud)