2016-04-14 8 views
17

Ich möchte eine Observable erstellen, die Daten von einem Webapi zurückgibt. Ich möchte, dass die Daten sofort zurückgegeben werden und die API alle 10 Sekunden abgefragt wird. Der folgende Code zeigt, dass ich die Methode 'interval' verwende. Dies verzögert jedoch den ersten Datensatz um 10 Sekunden. Wie bekomme ich die erste Datenspülung ohne anfängliche Verzögerung herunter?Wie man eine Observable erhält, um Daten sofort und alle 5 Sekunden danach zurückzugeben. Benutze Intervall()?

export class EventService { 
    public events$: Observable<Event[]>; 
    private _eventsObserver: Observer<Event[]>; 
    private pollInterval: number = 5000; 

    private _dataStore: { 
     events: Event[]; 
    }; 

    constructor(private http: Http) { 
     this._dataStore = { events: [] }; 

     this.events$ = new Observable(observer => this._eventsObserver = observer) 
      .startWith(this._dataStore.events) 
      .share(); 
    } 

    pollEvents() { 
     return Observable.interval(10000) 
      .switchMap(() => { 
       return this.http.get('app/resources/data/scheduleevents.json') 
        .map((responseData) => { 
         return responseData.json(); 
        }); 
      }) 
      .map((events: Array<any>) => { 
       let result: Array<Event> = []; 
       if (events["data"]) { 
        events["data"].forEach((event) => { 
         result.push(event); 
        }); 
       } 
       return result; 
      }); 
    } 
} 

Antwort

47

Verstanden !!!

 .interval(5000) 
     .startWith(0) 

einfach.

+1

abmelden Wenn Sie das bisschen Code hinzugefügt haben? –

+0

aber dann bekomme ich 0 zweimal https://plnrkr.co/edit/Cl5DQ7znJRDe0VTv0Ux5?p=preview – adamdport

+0

schön! Danke vielmals!! –

8

Timer verwenden. Ich denke, die timer ist, was Sie brauchen (siehe RxJS Reiter): http://reactivex.io/documentation/operators/timer.html#collapseRxJS

Könnte wie verwendet werden:

Observable.timer(0, 5000).flatMap(() => apiCall()) 

Wo 0 - Verzögerung vor dem ersten Wert aussendet, 5000 - Wert nach jeweils 5 s emittieren

enter image description here

+0

Es ist als veraltet gekennzeichnet in intelliJ, sollten Sie jetzt Intervall – Cyril

+0

verwenden http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-timer Ich glaube nicht, dass es veraltet ist. – maxisam

0

Für angualr2 unten ist der Code, den ich in meiner Anwendung geschrieben haben und es wie erwartet funktioniert -

In Service -

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/Rx'; 

getList(): Observable<IVM> { 
    return Observable.interval(5000).startWith(0) 
      .switchMap(() => 
      this._http.get(this._vmURL) 
       .map((response: Response) => <IVM>response.json().data) 
       .do(data => console.log('All: ' + JSON.stringify(data))) 
       .catch(this.handleError) 
      ); 
} 

In Komponente -

private getInstanceDetails(): void { 
    this._vmDataService.getList() 
     .subscribe(vmList => { 
      //Do whatever you want with the vmList here :) 
     }, 
     error => this.errorMessage = <any>error); 
} 

Danke, Bitte teilen Sie mir Ihre Meinung wissen.

1
let timer = TimerObservable.create(0, 5000); 
    this.sub = timer.subscribe(t => { 
     this.yourMethod() 
    }); 

laufen zu lassen this.sub.unsubscribe()

Verwandte Themen