2016-09-23 35 views
1

我正在构建一个会话倒计时应用,登录后设置为3600。Angular 2 + ngrx:实现会话计时器

当计时器达到60时,应用程序应提醒用户扩展会话。当计时器达到0时,应用程序应该注销。

某些请求(POST)会重置会话计时器,其他请求不会。

我有一个auth.reducer它处理像登录,login_success等和auth.effect类的情况下,我设置会话持续时间从服务器返回的实际持续时间。

我的问题是:

  1. 我在哪里放,并开始Observable.timer/interval? 我有以下选择:

    • dashboard.component
    • auth.effects
    • auth.service
  2. 难道我创建一个动作DECREMENT_TIMER还是我只是创建一个动作TIMER_TIMEOUT当可观察结束倒计时?

  3. 我应该如何格式化AuthState?我有一个sessionSecondsLeft计数器,每秒递减DECREMENT_TIMER,还是只有一个属性countdown_at_60countdown_finished更好?

这是什么最佳实践?

回答

2

一个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}) 
    ) 
) 
+0

感谢您的评论。我知道将不得不实施另一个计时器,从3600 - 60倒计时,以调用TIMER_RESET行动。我有一个问题,但。我会把那个计时器放在哪里? auth.service或dashboard.component? –

+0

好吧,没有。在'TIMER_RESET'被触发后,第一个Observable将在59分钟后发送'TIMER_WARNING',第二个将在此后1分钟发送'TIMER_EXPIRED'。 'Observable.concat()'订阅传入的Observables _in sequence_。如果先前调度另一个'TIMER_RESET',则两个定时器将被丢弃以用于新定时器。 – j2L4e

+0

好吧,我现在看到,我在login_success或每次POST请求后调用timer_reset。谢谢。 –