角度 2 中的事件发生后重置计时器

fat*_*tah 2 rxjs angular

我在 15 分钟空闲会话后实现注销,而不使用第 3 方库或 ngrx。我创建了一个服务:

run(){
    window.onload = () => {this.startTimer()};
    window.onmousemove = () => {this.resetTimer()};
}

startTimer(){
    let ticks = Observable.timer(0, 1000);
    return ticks
}
resetTimer(){
    // code here
}

sessionTimeOut(){
    // logic to logout
    this.resetTimer().subscribe(val =>{console.log(val)}
}
Run Code Online (Sandbox Code Playgroud)

我使用一些函数创建了一些rxjs方法,到目前为止,它们都不起作用,是否可以获得有关resetTimer()方法的帮助?谢谢。

sub*_*aze 5

您可以使用switchMapmousemove 事件来重新启动计时器,此路线无需跟上计时器值,只需插入 15000 即可设置并忘记。

const newTimer = () => Rx.Observable.timer(3000);
const mouseMove = Rx.Observable.fromEvent(document, 'mousemove')
    .startWith("loaded")
    .throttleTime(250);
const logOut = mouseMove.switchMapTo(newTimer());

logOut.subscribe(() => console.log('logout'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>

move mouse around here to not log out
Run Code Online (Sandbox Code Playgroud)

从下面请求发出的注释中,我假设每秒都会发出一次,并且值重置为mousemove

const mouseMove = Rx.Observable.fromEvent(document, 'mousemove')
  .startWith("loaded")
  .throttleTime(250)
  .do(() => console.log("restart timer"));
const newTimer = () => {
  console.log("starting timer");
  return Rx.Observable.timer(0, 1000);
};
const timer = mouseMove.switchMapTo(newTimer());

timer.subscribe(v => console.log(v));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)