Ответ 1
Понял:
.interval(5000)
.startWith(0);
Я хочу создать наблюдаемую, которая возвращает данные из вебапи. Я хотел бы, чтобы он немедленно возвращал данные и опрашивал API каждые 10 секунд. Код ниже показывает, что я использую метод "интервал". Но это задерживает первый набор данных на 10 секунд. Как мне получить этот первый сброс данных без первоначальной задержки?
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;
});
}
}
Понял:
.interval(5000)
.startWith(0);
Используйте таймер. Я думаю, что timer
- это то, что вам нужно (см. Вкладку RxJS): http://reactivex.io/documentation/operators/timer.html#collapseRxJS
Может быть использован как:
Observable.timer(0, 5000).flatMap(() => apiCall())
Где 0
- задержка перед выдачей первого значения, 5000
- выдача значения через каждые 5 с
let timer = TimerObservable.create(0, 5000);
this.sub = timer.subscribe(t => {
this.yourMethod()
});
Чтобы отменить подписку this.sub.unsubscribe()
Для angualr2 ниже приведен код, написанный в моем приложении, и он работает как ожидалось -
В сервисе -
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)
);
}
В компоненте -
private getInstanceDetails(): void {
this._vmDataService.getList()
.subscribe(vmList => {
//Do whatever you want with the vmList here :)
},
error => this.errorMessage = <any>error);
}
Спасибо, Пожалуйста, дайте мне знать ваши мысли.
Observable.interval(5L, TimeUnit.SECONDS)
.startWith(0)
.observeOn(AndroidSchedulers.mainThread())
.map { foobar() }
прекрасно работает для меня Спасибо
Я лично использую интервал с startWith (нужно RxJs 6+), вот полный пример:
history: any;
historySubscription: Subscription;
constructor(private jobService: JobService) { }
ngOnInit() {
this.historySubscription = interval(10000).pipe(
startWith(0),
flatMap(() => this.jobService.getHistory())
).subscribe(data => {
this.history = data;
});
}
ngOnDestroy() {
this.historySubscription.unsubscribe();
}
Это возвращает историю по init, а затем каждые 10 секунд.
Другой альтернативой является использование таймера, как объяснено @Alendorff.