js timer启动两次怎么停止呀?

JavaScript04

js timer启动两次怎么停止呀?,第1张

楼主你首先得分清setInterval和setTimeout的区别。

var handler = setInterval(action, intervalTime):从运行这行代码开始,每隔intervalTime(单位是毫秒)的时间就把action执行一次,直到运行至调用clearInterval(handler)为止。

var handler = setTimeout(action, delayTime):从运行这行代码开始计时,等到delayTime(单位是毫秒)的时刻立即把action执行一次。在没到达delayTime时刻之前你可以调用clearTimeout(handler)来清除这次调用。

现在来看你的问题,

1. 为啥timer还可以用?

var timer

timer = window.setInterval("Readcadetimer()", 1000)

你定义了一个timer变量,然后将计时器的句柄赋给它(此处的timer变量实际上就是我上面说的handler,是定时器的句柄)。运行至此处则每隔1秒(1000毫秒)运行Readcadetimer()一次。

你在没有将该定时器清除的情况下,又写了一句:

timer = window.setInterval("Readcadetimer()", 1000)

这时候你又创建了一个定时器,然后将句柄赋给了timer,第一个定时器的句柄虽然再也没有索引了,但是它实实在在存在。第二个定时器的作用仍然是每隔1秒(1000毫秒)运行Readcadetimer()一次。

下一句clearInterval(timer)

这句将你创建的第二个计时器给清除了,但是第一个计时器还在运行,所以你觉得好像timer还可以用一样。

2. timer这个数字代表啥意思?

timer没啥意思,他就是一个持有计时器对象的句柄,就相当于你想用你之前创建的计时器的时候,你可以通过timer找到它。

看你的代码需求貌似是想要把Readcadetimer()执行两次然后就结束,这里奉上代码。

请将你Readcadetimer()的定义放在我的代码之前。

var counter = 0,

    handler = setInterval(function(){

        counter++

        if( counter > 2 ){

            clearInterval(handler)

            return

        }

        Readcadetimer()

    }, 1000)

不准的原因是,setTimeout 是一个异步任务,在执行到 setTimeout 的时候,js 引擎不会立刻把定时任务放到事件循环的任务队列中,而是等待时间到了,再放进事件循环的队列中。

注意,是时间到了才加入队列,那么如果队列中已经有了其他的任务要执行,这个新加的定时器任务自然要等待前面的任务结束,所以时间会延后。

我们只能尽量调整延后的时间偏差,不能修正到完全精确,代码如下

// performance.now 比 Date.now 更精确

let startTime = performance.now()

// count表示定时器被调用的次数,次数需要是全局变量

let count = 0

function myTimeout(){

let runTime = performance.now()

// 先增加次数

++count

// diffTime 就是已经延后的时间

let diffTime = (runTime - (startTime + count * 1000))

// 既然已经延后了,就需要时间间隔,减去已经拖延的时间,提前开始

setTimeout(myTimeout, 1000 - diffTime)

}

let t = setTimeout(myTimeout , 1000)

js中setTimeout定时器不准的原因,以及修正的办法