Время ожидания сеанса продолжает вызывать функцию в Angular 6 - PullRequest
0 голосов
/ 02 февраля 2020

Я новичок в Angular, я использую bn-ng-idle для тайм-аута сессии, он работает нормально, однако, когда я помещаю код в ngOnInit или Constructor, код повторяется снова и снова, хотя я я даже не на той же странице, поэтому, когда я захожу на страницу сотрудников и затем перенаправляюсь на страницу входа, код внутри конструктора по какой-то причине продолжает повторяться, спасибо за помощь.

employee.component.ts

constructor(private bnIdle: BnNgIdleService, private router: Router){
this.bnIdle.startWatching(5).subscribe((isTimedOut: boolean) => {
    if (isTimedOut) {
      this.router.navigate(['/signin']);
      console.log('session expired');
    }
    return;
  });
}

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Проверьте функцию startWatching. что происходит, когда он завершает sh (число 5 относится к минутам?), он сбрасывает себя к своему начальному значению? потому что если он это сделает, он просто продолжит работать.

Неважно, на какой странице вы находитесь. это одна из особенностей наблюдаемых. Когда вы регистрируете один, он продолжает слушать. Вот почему вы должны отписаться (в ng-destroy) от них, или у вас будет утечка памяти.

Мне не очень ясно, чего вы хотите достичь, это контролировать время, прошедшее для пользователя с тех пор, как он залогинен? Лучше сделать это с токенами и установить для них время.

Если вы все еще хотите использовать используемый вами метод, вы можете добавить условие, которое проверяет, находится ли пользователь на стороне сотрудника:

например:

isInEmployee: boolean;

constructor(private bnIdle: BnNgIdleService, private router: Router){

}

ngOnInit() {
  this.isInEmployee = true;

this.bnIdle.startWatching(5).subscribe((isTimedOut: boolean) => {
    if (isTimedOut && isInEmployee) ) {
      this.router.navigate(['/signin']);
      console.log('session expired');
    }
    return;
  });
}


ngOnDestroy() {
this.isInEmployee = false; -> with your method

//but its better to unsubscribe from 'startWatching'

}

Но я бы порекомендовал использовать JWT для любых сеансовых операций с помощью sessionStroage

0 голосов
/ 02 февраля 2020

необходимо хранить подписку в переменной подписки, а при уничтожении компонента подписку нужно отписаться.

private sessionSubscription: Subscription;
ngOnInit(): void{
    this.sessionSubscription = this.bnIdle.startWatching(5).subscribe((isTimedOut: boolean) => {
        if (isTimedOut) {
        this.router.navigate(['/signin']);
        console.log('session expired');
        }
        return;
    });
 }

ngOnDestroy(): void {
    if (this.sessionSubscription){
      this.sessionSubscription.unsubscribe();
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...