Angular Rxjs全局任务计时器

Angular Rxjs全局任务计时器,angular,timer,rxjs,Angular,Timer,Rxjs,我正在尝试在我的应用程序上创建全局任务计时器 我正在寻找以下方面的解决方案: -当我单击开始任务进度时,计时器将计数60秒。 -但当我更改页面(另一个组件)并返回到上一个页面时,计时器仍在计数 你认为这是个好主意吗?我在实现它方面有问题。或者RxJs有现成的解决方案 我的意思是,最好的解决办法是什么 谢谢您的建议。您可以将可观察到的计时器存储在服务中,确保从服务中订阅,以免丢失所有订户。大致如下: private timer=interval(1000).pipe(take(60)); priv

我正在尝试在我的应用程序上创建全局任务计时器

我正在寻找以下方面的解决方案: -当我单击开始任务进度时,计时器将计数60秒。 -但当我更改页面(另一个组件)并返回到上一个页面时,计时器仍在计数

你认为这是个好主意吗?我在实现它方面有问题。或者RxJs有现成的解决方案

我的意思是,最好的解决办法是什么


谢谢您的建议。

您可以将可观察到的计时器存储在服务中,确保从服务中订阅,以免丢失所有订户。大致如下:

private timer=interval(1000).pipe(take(60));
private timerStarted=false;
startTimer(){
这个,计时器,烟斗(
轻触(()=>this.timerStarted=true),
完成(()=>this.timerStarted=false)
).subscribe();
}
getTimer(){
返回这个.timer;
}
getTimerStarted(){
返回此。timerStarted;
}
然后,在组件中:

private destroy$=新主题();
恩戈尼尼特(){
if(this.timerService.getTimerStarted()){
这个.timerService.getTimer()管道(
takeUntil(这个.destroy$),
//在这里处理计时器的事情
).subscribe();
}
}
onStartTimer(){
this.timerService.startTimer();
这个.timerService.getTimer()管道(
takeUntil(这个.destroy$),
//在这里处理计时器的事情
).subscribe();
}
恩贡德斯特罗(){
this.destroy$next(true);
}

编辑:将
take(60)
移动到可观察对象本身,而不是移动到
startTimer
方法中的对象。这将防止从外部订阅时计时器计数超过60秒。

您可以将可观察到的计时器存储在服务中,确保从服务内部订阅,以免丢失所有订阅者。大致如下:

private timer=interval(1000).pipe(take(60));
private timerStarted=false;
startTimer(){
这个,计时器,烟斗(
轻触(()=>this.timerStarted=true),
完成(()=>this.timerStarted=false)
).subscribe();
}
getTimer(){
返回这个.timer;
}
getTimerStarted(){
返回此。timerStarted;
}
然后,在组件中:

private destroy$=新主题();
恩戈尼尼特(){
if(this.timerService.getTimerStarted()){
这个.timerService.getTimer()管道(
takeUntil(这个.destroy$),
//在这里处理计时器的事情
).subscribe();
}
}
onStartTimer(){
this.timerService.startTimer();
这个.timerService.getTimer()管道(
takeUntil(这个.destroy$),
//在这里处理计时器的事情
).subscribe();
}
恩贡德斯特罗(){
this.destroy$next(true);
}

编辑:将
take(60)
移动到可观察对象本身,而不是移动到
startTimer
方法中的对象。这应该可以防止从外部订阅时计时器计数超过60秒。

Hmm我如何检查计时器的当前值?您可以在需要当前值的任何位置订阅它(只要它已经启动)。您可以使用
take(1)
获取其当前值,然后完成。工作非常好!有一个解决方案来设置计时器的最大值吗?F.e.10秒?这就是我在
startTimer
方法中对
take(60)
行所做的。它需要60次发射,然后完成,因为
间隔
每秒发射一次,这就需要60秒!您甚至可以将其作为参数传递给
startTimer
,允许您每次自定义计时器。啊,当然,让我编辑答案,我想我有解决方案。嗯,我如何检查计时器的当前值?您可以在需要当前值的任何位置订阅它(只要它已经启动)。您可以使用
take(1)
获取其当前值,然后完成。工作非常好!有一个解决方案来设置计时器的最大值吗?F.e.10秒?这就是我在
startTimer
方法中对
take(60)
行所做的。它需要60次发射,然后完成,因为
间隔
每秒发射一次,这就需要60秒!您甚至可以将其作为参数传递给
startTimer
,允许您每次自定义计时器。啊啊,当然,让我编辑答案,我想我已经为您找到了解决方案。