40 lines
1.0 KiB
JavaScript
40 lines
1.0 KiB
JavaScript
|
export class Timer {
|
||
|
constructor(time, node) {
|
||
|
this.time = time;
|
||
|
this.node = node;
|
||
|
this.isStarted = false;
|
||
|
}
|
||
|
start() {
|
||
|
this.isStarted = true;
|
||
|
this.schedule();
|
||
|
}
|
||
|
stop() {
|
||
|
if (this.isStarted) {
|
||
|
if (this.intervalID) {
|
||
|
clearTimeout(this.intervalID);
|
||
|
this.intervalID = null;
|
||
|
this.isStarted = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
schedule() {
|
||
|
let toWait = this.time;
|
||
|
if (this.lastTime) {
|
||
|
const fluc = Date.now() - this.lastTime;
|
||
|
this.fluctuation = fluc;
|
||
|
toWait -= fluc;
|
||
|
}
|
||
|
this.lastTime = Date.now();
|
||
|
this.intervalID = setTimeout(this.handleResolve.bind(this), toWait);
|
||
|
}
|
||
|
handleResolve() {
|
||
|
this.lastTime = Date.now();
|
||
|
if (this.node) {
|
||
|
this.node.func(this.time / this.lastTime);
|
||
|
}
|
||
|
if (this.isStarted) {
|
||
|
this.schedule();
|
||
|
}
|
||
|
}
|
||
|
}
|