2016-09-23 18 views
1

私はログイン後に3600に設定されるセッションのカウントダウンでアプリケーションを構築しています。角2 + ngrx:セッションタイマを実装

タイマーが60に達すると、アプリはセッションを延長するようユーザーに警告する必要があります。タイマーが0になると、アプリはログアウトする必要があります。

一部のリクエスト(POST)によってセッションタイマーがリセットされるものもあれば、そうでないものもあります。

私は、login、login_successなどのケースとauth.effectクラスを扱うauth.reducerを持っています。ここでは、session-durationにサーバーから返された実際の時間を設定します。

私の質問は以下のとおりです。

  1. 私はObservable.timer/intervalを入れて起動しますか? 私は、次のオプションがあります。

    • dashboard.component
    • auth.effects
    • auth.service
  2. を私はアクションDECREMENT_TIMERを作成してくださいまたは観察可能でカウントダウンを完了したときに、私はちょうどアクションTIMER_TIMEOUTを作成するのですか?

  3. AuthStateをどのようにフォーマットする必要がありますか?私はで毎秒減っていくsessionSecondsLeftカウンタを持っているのですか、それともちょうどプロパティーcountdown_at_60countdown_finishedを持っている方が良いですか?

このためのベストプラクティスは何ですか?

DECREMENT_TIMERアクションが1秒に1回、あなたの状態を更新してしまうと、(あなたが店-デベロッパーツールを使用している場合)にも、あなたの行動ログをスパムう

答えて

2

私の提案:

アクションTIMER_RESETを作成します。あなたがそれを表示したい場合は、店にタイムスタンプを保存することができますが、1分足らずになるまでそれを必要とは思わないと思います。

@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アクションを呼び出すためにカウントダウンする別のタイマーを実装しなければならないと理解しています。私は1つの質問がある。私はそのタイマーをどこに置くのですか? auth.serviceまたはdashboard.component? –

+0

まあ、いいえ。 'TIMER_RESET'が起動された後、最初のObservableは59分後に' TIMER_WARNING'を送出し、2分目は1分後に 'TIMER_EXPIRED'をディスパッチします。 'Observable.concat()'は、渡されたObservable _in sequence_にサブスクライブします。以前に別の 'TIMER_RESET'がディスパッチされた場合、両方のタイマーは新しいタイマーのために破棄されます。 – j2L4e

+0

これで、login_successの後、またはPOSTリクエストごとにtimer_resetを呼び出しました。ありがとう。 –

関連する問題