Сначала я бы создал класс Alarm, который может планировать себя и содержать его состояние:
class Alarm {
public lastRangTime = 0;
private stopper = new Subject<void>();
get hasRang() {
return this.lastRangTime > 0;
}
get remaining() {
return this.ringTime - Date.now();
}
// add more metadata
constructor(public ringTime: number, public interval: number) {}
start(): Observable<number> {
return timer(this.ringTime - Date.now(), this.interval)
.pipe(
tap(() => {
this.lastRangTime = this.ringTime;
this.ringTime += this.interval;
}),
takeUntil(this.stopper)
)
}
stop() {
this.stopper.next();
}
}
И какой-нибудь контейнер / сервис для хранения всех подписок:
class AlarmScheduler {
private queue = new Subject<Alarm>();
private subscription: Subscription = null;
schedule(ringTime: number, interval: number = DEFAULT_INTERVAL) {
const alarm = new Alarm(ringTime, interval);
this.queue.next(alarm);
return alarm;
}
initialize() {
this.subscription = this.queue
.pipe(mergeMap(alarm => alarm.start()))
.subscribe();
}
destroy() {
this.subscription.unsubscribe();
}
}
Чем вы могли бы просто запланировать тревоги от AlarmScheduler
. Они будут повторяться с заданным интервалом.
const scheduler = new AlarmScheduler();
scheduler.initialize();
const a1 = scheduler.schedule(Date.now() + 5000);
const a2 = scheduler.schedule(Date.now() + 10000);
Рабочий пример: https://stackblitz.com/edit/typescript-uft7up
Конечно, вам придется проработать некоторые детали, но что касается планирования сигналов тревоги, я надеюсь, что приведенного выше кода достаточно для начала работы.