Если вы используете timer
вместо interval
и установите начальную задержку на 0
, то ваш интервал сработает немедленно.
Вы можете использовать оператор takeUntil
, чтобы запретить выполнение интервала всегда, и оператор repeatWhen
, чтобы перезапустить его в любое время:
import { Observable, Subject, timer } from 'rxjs';
import { repeatWhen, switchMap, takeUntil } from 'rxjs/operators';
export class RepeatingServiceCall<T> {
readonly observable$: Observable<T>;
private readonly _stop = new Subject<void>();
private readonly _start = new Subject<void>();
constructor(serviceCall: () => Observable<T>, delay: number) {
this.observable$ = timer(0, delay)
.pipe(
switchMap(() => serviceCall()),
takeUntil(this._stop),
repeatWhen(() => this._start)
);
}
start(): void {
this._start.next();
}
stop(): void {
this._stop.next();
}
}
Вот рабочий пример StackBlitz .
P.S .: Методы получения и установки работают по-разному. Таким образом, вам не нужна классическая концепция получения, вы можете просто сделать атрибут public
и readonly
.