项目中需要实现倒计时的功能,以前做IOS时,可以利用NSTimer或者GCD时间定时任务,在定时触发的方法中对倒计时的时长-1,达到0后,倒计时结束。但是这种方法在JS中并不可行,会出现计时不准确的问题,造成这个问题的原因是事件循环机制。
在NodeJS中,一般通过setTimeout和setInterval两个方法实现定时触发任务,setTimeout和setInterval是将任务加入到任务队列,但是这些任务并不会被立即执行,而是要等待之前的任务执行完毕后才会调用,如果任务的计算比较耗时,就会造成技术的不准确,例如setInterval每1秒执行计时任务,setInterval每1秒钟就会向任务队列中添加计时任务,但是并不代表每一秒就会执行计时任务。
这样的就通过校正的方法来实现倒计时功能。
class CountDownTimer {
private timer: NodeJS.Timer
private endTime: number = 0
public startTimer(duration: number) {
const nowDate = new Date()
this.endTime = nowDate.getTime() + duration
this.doTimer()
}
public stopTimer() {
if (this.timer) {
clearTimeout(this.timer)
}
}
private doTimer() {
const nowDate = new Date()
const lef