Quiero crear un observable que devuelve los datos de una webapi. Me gustaría que devolver los datos inmediatamente, y el sondeo de la API de cada 10 segundos. El código siguiente muestra estoy usando el ‘intervalo’ método. Pero esto retrasa el primer conjunto de datos por 10 segundos. ¿Cómo puedo conseguir que el primer brote de datos a venir abajo 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;
            });
    }
}
InformationsquelleAutor FeeFiFoFum | 2016-04-14

5 Comentarios

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

    Para darse de baja de ejecutar this.sub.unsubscribe()

  2. 0

    Para angualr2 a continuación es 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)
                 );
    }
    

    Componente —

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

    Gracias,
    Por favor, hágamelo saber sus pensamientos.

  3. 0
    Observable.interval(5L, TimeUnit.SECONDS)
            .startWith(0)
            .observeOn(AndroidSchedulers.mainThread())
            .map { foobar() }
    

    funciona muy bien para mí.
    Gracias

Dejar respuesta

Please enter your comment!
Please enter your name here