rxjs - programacion - Cómo hacer que un observable devuelva datos inmediatamente y cada 5 segundos a partir de entonces
que es un observable angular (4)
Quiero crear un observable que devuelva datos de un webapi. Me gustaría que devuelva los datos de inmediato, y sondear la API cada 10 segundos. El siguiente código muestra que estoy usando el método ''intervalo''. Pero esto retrasa el primer conjunto de datos por 10 segundos. ¿Cómo puedo obtener el primer flujo de datos sin demora inicial?
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;
});
}
}
Lo tengo:
.interval(5000)
.startWith(0);
Para angualr2 a continuación está el código que he escrito en mi aplicación y está funcionando como se esperaba:
En servicio --
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 componente -
private getInstanceDetails(): void {
this._vmDataService.getList()
.subscribe(vmList => {
//Do whatever you want with the vmList here :)
},
error => this.errorMessage = <any>error);
}
Gracias, amablemente dime tus pensamientos.
Usa el temporizador Creo que el timer
es lo que necesita (vea la pestaña RxJS): http://reactivex.io/documentation/operators/timer.html#collapseRxJS
Podría ser utilizado como:
Observable.timer(0, 5000).flatMap(() => apiCall())
Donde 0
- retrasar antes de emitir el primer valor, 5000
- emitir valor después de cada 5s
let timer = TimerObservable.create(0, 5000);
this.sub = timer.subscribe(t => {
this.yourMethod()
});
Para cancelar la suscripción, ejecute this.sub.unsubscribe()