setTimeout模拟setInterval
程序员文章站
2024-02-01 08:51:10
...
setInterval存在的问题
首先明确,无论setTimeout还是setInterval,都是在指定时间,将回调函数推入任务队列,无法保证实际执行时间。
区别在于,setTimeout直接推入,setInterval会检查任务队列中是否存在相同的回调函数(未执行),若有则跳过本次推入。
上图中,setInterval的时间间隔是200ms,但回调函数执行需要较长时间,605ms推入时,发现405ms的回调函数仍未执行,因此跳过本次推入。
由此会引发多个回调函数执行的时间间隔,小于设定的参数值,甚至参数值被忽略而连续执行。
setTimeout模拟setInterval
const mySetInterval = (callback, delay) => {
const rec = (callback, delay) => {
setTimeout(() => {
callback() // 执行callback
rec(callback, delay) // 递归
}, delay)
}
rec(callback, delay)
}