2017-02-21 5 views
3

Ich habe grundsätzlich eine Klasse, die commModel.sessionState$ abonnieren sollte und wenn isValid ist wahr, sollte es den Timer abbrechen und neu erstellen. Das Problem ist, dass wenn der Timer ausgelöst wird, bekomme ich diesen Fehler: TypeError: Cannot read property 'setSessionState' of undefined, aber wenn das Debuggen im Konstruktor commModel ist in Ordnung. Auch die console.log im Abonnement wird nicht ausgeführt. Wo ist das Problem und wie kann ich es beheben?Anrufer oder Abbrechen Timer Ereignis Winkel 2

import { Injectable } from '@angular/core'; 
import { CommonModel } from '../core/store/common.model'; 
import { Observable } from 'rxjs/Observable'; 

import 'rxjs/add/observable/interval'; 
import 'rxjs/add/operator/publish'; 
import 'rxjs/add/operator/startWith'; 

@Injectable() 
export class SessionTimeoutHandler { 

    sessionState: Observable<boolean>; 
    timeoutCountdown$: Observable<boolean>; 

    timer: any; 

    constructor(private commModel: CommonModel) { 
    this.sessionState = commModel.sessionState$; 
    this.sessionState.subscribe(
     isValid => { 
     console.log('test',isValid); 
     if(isValid) { 
      clearTimeout(this.timer); 
      this.timer = setTimeout(this.invalidateSessionState, 5 * 1000); 
     } 
     } 
    ) 

    this.timer = setTimeout(this.invalidateSessionState, 5 * 1000); 
    } 

    invalidateSessionState() { 
    this.commModel.setSessionState(false); 
    } 

} 
+1

Ich gehe davon aus für 'setTimeout()' sollten Sie 'clear (this.timer) verwenden ; ' –

+0

@ GünterZöchbauer Ja, tut mir leid, habe gerade gesehen, aber das hilft nicht bei dem undefinierten Fehler. – user3719857

Antwort

3

this braucht besondere Aufmerksamkeit von bind mit:

this.timer = setTimeout(this.invalidateSessionState.bind(this), 5 * 1000); 

oder Pfeil Funktionen

this.timer = setTimeout(() => this.invalidateSessionState(), 5 * 1000);