2016-04-14 13 views
17

Voglio creare un osservabile che restituisca i dati da un webapi. Mi piacerebbe che restituisse immediatamente i dati e interrogare l'API ogni 10 secondi. Il codice qui sotto mostra che sto usando il metodo 'interval'. Ma questo ritarda il primo set di dati di 10 secondi. Come faccio a far sì che il primo flusso di dati venga giù senza alcun ritardo iniziale?Come ottenere un osservabile per restituire i dati immediatamente e successivamente ogni 5 secondi. Usa intervallo()?

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

risposta

47

Capito !!!

 .interval(5000) 
     .startWith(0) 

facile.

+1

Dove ha fatto si aggiunge quel po 'di codice? –

+0

ma poi ottengo 0 due volte https://plnkr.co/edit/Cl5DQ7znJRDe0VTv0Ux5?p=preview – adamdport

+0

incantevole! molte grazie!! –

8

Utilizzare il timer. Penso che la timer è quello che vi serve (vedi scheda RxJS): http://reactivex.io/documentation/operators/timer.html#collapseRxJS

Potrebbe essere usato come:

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

Dove 0 - ritardo prima di emettere il primo valore, 5000 - emettono valore dopo ogni 5s

enter image description here

+0

È contrassegnato come deprecato in intelliJ, dovresti ora usare l'intervallo – Cyril

+0

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-timer Non penso che sia deprecato. – maxisam

0

Per angualr2 di sotto è il codice che ho scritto nella mia richiesta e funziona come previsto -

In servizio -

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 componente -

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

Grazie, lasciato gentilmente sapere i vostri pensieri.

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

Per annullare l'iscrizione run this.sub.unsubscribe()

Problemi correlati