Angular 2 + ngrx:实现会话计时器
问题描述:
我正在构建一个会话倒计时应用,登录后设置为3600。Angular 2 + ngrx:实现会话计时器
当计时器达到60时,应用程序应提醒用户扩展会话。当计时器达到0时,应用程序应该注销。
某些请求(POST)会重置会话计时器,其他请求不会。
我有一个auth.reducer
它处理像登录,login_success等和auth.effect
类的情况下,我设置会话持续时间从服务器返回的实际持续时间。
我的问题是:
-
我在哪里放,并开始
Observable.timer/interval
? 我有以下选择:dashboard.component
auth.effects
auth.service
难道我创建一个动作
DECREMENT_TIMER
还是我只是创建一个动作TIMER_TIMEOUT
当可观察结束倒计时?我应该如何格式化AuthState?我有一个
sessionSecondsLeft
计数器,每秒递减DECREMENT_TIMER
,还是只有一个属性countdown_at_60
和countdown_finished
更好?
这是什么最佳实践?
答
一个DECREMENT_TIMER
行动将更新您的状态每秒一次,也将垃圾邮件的操作日志(如果你使用商店devtools)
我的建议:
创建一个动作TIMER_RESET
。如果你想显示它,你可以在商店中保存一个时间戳,但是在剩下不到一分钟之前,我认为你不需要它。
@Effect() TIMER_RESET$ = this.actions$
.ofType(TIMER_RESET)
.switchMap(
Observable.concat(
Observable.timer(1000*60*59).map({type: TIMER_WARNING}),
Observable.timer(1000*60*1).map({type: TIMER_EXPIRED})
)
)
感谢您的评论。我知道将不得不实施另一个计时器,从3600 - 60倒计时,以调用TIMER_RESET行动。我有一个问题,但。我会把那个计时器放在哪里? auth.service或dashboard.component? –
好吧,没有。在'TIMER_RESET'被触发后,第一个Observable将在59分钟后发送'TIMER_WARNING',第二个将在此后1分钟发送'TIMER_EXPIRED'。 'Observable.concat()'订阅传入的Observables _in sequence_。如果先前调度另一个'TIMER_RESET',则两个定时器将被丢弃以用于新定时器。 – j2L4e
好吧,我现在看到,我在login_success或每次POST请求后调用timer_reset。谢谢。 –