2016-09-23 34 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。謝謝。 –