Проблема в том, что в вашем сервисе вы не сбрасываете таймер с setTimer
, а создаете новый. Подписка на другой компонент все еще существует в Observable, который все еще "жив". Единственное, что вы изменили, - это ссылка timer
, поэтому любые новые подписки будут подписываться на новую, но старые подписки все равно будут существовать.
Что вы хотите сделать, это остановить первый таймер при переопределении, а затем установить новый таймер. Но это решило бы только первую половину вопроса: ваши подпитки все равно будут слушать и ждать таймера. Таким образом, вы должны переопределить логику своего приложения, «завершить» таймеры или просто отписаться от них.
Чтобы увидеть, как остановить наблюдаемый таймер, прочитайте этот вопрос . По сути, вам нужно unsubscribe()
сначала в каждой отдельной подписке , а затем повторно подписаться. Я достиг бы этого с другой наблюдаемой (например, «alertWhenNewTimerIsSet ()» или чем-то еще), а затем повторно подписался бы на новое значение, используя сами subscription
.
что-то вроде этого:
timerservice.ts:
timer: Observable<any>;
renewSubscriptionsAlert: new EventEmitter<any>();
setTimer(timerVal: number) {
timer.renewSubscriptionsAlert.emit(true);
this.timer = Observable.timer(timerVal);
}
и в ваших компонентах:
mySubscription: any;
ngOnInit() {
this.timerService.setTimer(3000);
this.mySubscription = this.timerService.timer.subscribe(t => {
alert("hello");
});
this.timerService.renewSubscriptionsAlert(alert => {
myTimerServiceSubscription.unsubscribe();
this.mySubscription = this.timerService.timer.subscribe(t => {
alert("hello");
});
}
Кстати, если вам просто нужен таймер, вы также можете использовать метод window.setTimeout () .