Necesito ejecutar una función si ni el mouse se ha movido ni el teclado se ha tocado durante 1 min.
Probé el siguiente código pero no parece funcionar. ¿Cómo puedo arreglarlo? Gracias por tu ayuda.
mouseEvent$ = fromEvent(document, 'mouseMove'); keyPress$ = fromEvent(document, 'keyup'); merge( this.mouseEvent$.pipe(startWith(null)).pipe(switchMap(() => timer(10000, 1000))), this.keyPress$.pipe(startWith(null)).pipe(switchMap(() => timer(10000, 1000))), ).subscribe(() => console.log("----));Lo primero que debe notar es que escribió mouseMove incorrectamente.
Así es como podría hacer esto:
merge( fromEvent(document, 'mousemove'), fromEvent(document, 'keyup') ).pipe( share(), startWith(null), debounceTime(60000), take(1), retry() ).subscribe(_ => console.log("1 Minute without input"));Aquí está mi opinión sobre esto:
const mouseMove$ = fromEvent<MouseEvent>(document, 'mousemove'); const keyPress$ = fromEvent<KeyboardEvent>(document, 'keyup'); const mergeBothEvents = merge(keyPress$, mouseMove$); const interval$ = timer(60000); mergeBothEvents .pipe( startWith('initial'), switchMap(() => { return interval$; }) ) .subscribe(() => { console.log('60 seconds past'); console.log('Perform function here'); });Un poco de lo que sucede en el código.
fromEvent<MouseEvent> utilizado para capturar los movimientos del mouse.
fromEvent<KeyboardEvent> se usa para capturar el evento de clic de la tecla del teclado hacia arriba.
merge(keyPress$, mouse$) se usa para fusionar ambos observables para que puedan ejecutarse en paralelo.
timer(60000) se usa para verificar el tiempo de un minuto antes de ejecutar la función requerida.
En mergeBothEvents hemos usado más operadores startWith() y switchMap
startWith() se usa para el caso límite en el que si el usuario no hace nada (mouse o teclado) cuando ingresa a la página, no se emitirá el evento mergeBothEvents . Gracias a @MrkSef por señalarlo.
Finalmente switchMap se usa para cancelar la suscripción anterior del evento cuando el usuario mueve el mouse o presiona el teclado para que el temporizador se reinicie desde el segundo 0.