#angular #typescript #rxjs #polling
#angular #typescript #rxjs #опрос
Вопрос:
Я хочу поддерживать сеанс пользователя в рабочем состоянии с помощью активности пользователя, определенной как таковая.
Информационная система должна инициировать блокировку интерактивного сеанса после 15-минутного периода бездействия пользователя (бездействие определяется как отсутствие активности клавиатуры или мыши).
Это то, что я придумал .. как обычно, есть много способов выполнить что-то в RxJS, и мне было интересно, есть ли лучший способ или стандартная стратегия
Приведенный ниже пример будет пинговать сервер, если есть активность пользователя каждые 60 секунд
const userActivityEvents = [
fromEvent(document, 'click'),
fromEvent(document, 'wheel'),
fromEvent(document, 'scroll'),
fromEvent(document, 'keypress'),
fromEvent(document, 'mousemove'),
fromEvent(document, 'touchmove'),
];
merge(...userActivityEvents).pipe(
throttleTime(60 * 1000),
switchMap(() => this.apiService.get('/api/auth/ping', new HttpParams(), new HttpHeaders({ignoreLoadingBar: ''})),
),
).subscribe({error: () => undefined});
Комментарии:
1. что такое
{leading: true, trailing: false}
?2. это были значения по умолчанию rxjs-dev.firebaseapp.com/api/operators/throttleTime я обновил вопрос и удалил их, так как они ничего не добавляли
Ответ №1:
Поскольку в этом вопросе не было никакой поддержки, я мог бы также оставить свой окончательный ответ.
this.ngZone.runOutsideAngular(() => {
merge(
fromEvent(document, 'click'),
fromEvent(document, 'wheel'),
fromEvent(document, 'scroll'),
fromEvent(document, 'keypress'),
fromEvent(document, 'mousemove'),
fromEvent(document, 'touchmove'),
).pipe(
throttleTime(USER_ACTIVITY_POLL_TIME),
skip(1),
filter(() => !this.sessionModal),
filter(() => this.authService.authenticated),
switchMap(() => this.authService.ping(new HttpHeaders({ignoreLoadingBar: ''}))),
).subscribe({error: () => undefined});
});