На моем веб-сайте у меня есть глобальное раскрывающееся меню «Автообновление», которое позволяет вам выбрать интервал опроса: 0, 1, 2, 3 и т. Д., И при выборе этого параметра HTTP-API текущей страницы будут опрашиваются каждые 0, 1, 2, 3 секунды и т. д.
Пока у меня есть это:
import { Injectable, Output, EventEmitter } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Rx';
@Injectable()
export class ApiService {
private interval: number = 0;
constructor(private http: HttpClient) { }
autoRefreshObservable() {
if (this.interval > 0)
return Observable.timer(this.interval * 1000);
return Observable.timer(999999999999999);
}
getApi(url: string) {
return Observable.of(null)
.switchMap(e => this.autoRefreshObservable())
.flatMap(() => this.http.get(url))
.repeat();
}
updateInterval(i: number) {
this.interval = i;
}
}
И если я вызываю что-то вроде this.apiService.getApi("/api/foo").subscribe(response => {...})
в компоненте, это работает ... вроде. Если вы когда-нибудь установите автообновление на 0, оно больше не будет работать, пока вы не обновите страницу. Кроме того, я хочу, чтобы он немедленно возвращал первый ответ, но затем ожидал интервал для последующих ответов.
Это вообще возможно сделать изнутри сервиса? Или я должен перенести эту логику в компоненты, использующие ее?
Дело в том, что есть много компонентов, и добавление поддержки автоматического обновления для каждого из них потребует большого количества шаблонов; вот почему я надеялся перенести логику в общий сервис.