39 votes

Comment obtenir un observable pour renvoyer des données immédiatement et toutes les 5 secondes par la suite

Je veux créer un observable qui retourne des données d'un webapi. J'aimerais qu'il renvoie les données immédiatement et interroge l'API toutes les 10 secondes. Le code ci-dessous montre que j'utilise la méthode 'intervalle'. Mais cela retarde le premier ensemble de données de 10 secondes. Comment puis-je obtenir cette première flush de données à descendre sans délai initial?

 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;
            });
    }
}
 

78voto

FeeFiFoFum Points 972

Je l'ai:

         .interval(5000)
        .startWith(0);
 

21voto

Alendorff Points 1219

Utilisation de la minuterie. Je pense que l' timer est ce que vous avez besoin (voir RxJS onglet): http://reactivex.io/documentation/operators/timer.html#collapseRxJS

Peut être utilisé comme:

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

0 - délai avant d'émettre la première valeur, 5000 - émettre valeur après chaque 5s

enter image description here

3voto

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

Pour vous désabonner, exécutez this.sub.unsubscribe()

0voto

Pour angualr2 ci-dessous, le code que j’ai écrit dans mon application et il fonctionne comme prévu -

En 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)
             );
}
 

En composant -

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

Merci de bien vouloir me faire savoir vos pensées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X