2016-09-23 7 views
1

Ich baue eine App mit einer Sitzung Countdown, der nach der Anmeldung auf 3600 gesetzt wird.Angular 2 + ngrx: Implementieren Session-Timer

Wenn der Timer 60 erreicht, sollte die App den Benutzer darauf hinweisen, die Sitzung zu verlängern. Wenn der Timer 0 erreicht, sollte sich die App ausloggen.

Einige Anfragen (POST) setzen den Sitzungstimer zurück, andere nicht.

Ich habe eine auth.reducer, die Fälle wie Login, Login_Success usw. behandelt und eine auth.effect Klasse, wo ich Sitzungsdauer auf die tatsächliche Dauer vom Server zurückgegeben.

Meine Fragen sind:

  1. wo ich setzen und die Observable.timer/interval starten? Ich habe folgende Möglichkeiten:

    • dashboard.component
    • auth.effects
    • auth.service
  2. erstelle ich eine Aktion DECREMENT_TIMER oder erstelle ich gerade eine Aktion TIMER_TIMEOUT wenn der beobachtbare den Countdown beendet?

  3. Wie soll ich den AuthState formatieren? Habe ich einen sessionSecondsLeft Zähler, der jede Sekunde um DECREMENT_TIMER dekrementiert wird oder ist es besser, nur eine Eigenschaft countdown_at_60 und countdown_finished zu haben?

Was ist die beste Praxis dafür?

Antwort

2

A DECREMENT_TIMER Aktion würde Ihr Zustand einmal pro Sekunde aktualisiert und würde auch Spam Ihre Action-Log (wenn Sie Store-devtools verwenden)

Mein Vorschlag:

eine Aktion erstellen TIMER_RESET. Sie können einen Zeitstempel im Geschäft speichern, wenn Sie ihn anzeigen möchten, aber ich glaube nicht, dass Sie ihn brauchen, bis weniger als eine Minute übrig ist.

@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

Vielen Dank für Ihren Kommentar. Ich verstehe, dass ich einen anderen Timer implementieren müsste, der von 3600 - 60 herunterzählt, um die TIMER_RESET-Aktion aufzurufen. Ich habe jedoch eine Frage. Wo würde ich diesen Timer setzen? autor.service oder dashboard.component? –

+0

Nun, nein. Nachdem 'TIMER_RESET' gefeuert wurde, wird das erste Observable 'TIMER_WARNING' nach 59 Minuten und das zweite nach einer Minute' TIMER_EXPIRED' versenden. 'Observable.concat()' abonniert die übergebenen Observables _in sequence_. Wenn zuvor ein anderes 'TIMER_RESET' gesendet wird, werden beide Timer für neue gelöscht. – j2L4e

+0

Ok ich sehe jetzt, ich rufe timer_reset nach login_success oder nach jeder POST-Anfrage. Vielen Dank. –

Verwandte Themen