阅读 241
setTimeout模拟setInterval?反过来模拟?为什么用setTimeout模拟有什么好处?

setTimeout模拟setInterval?反过来模拟?为什么用setTimeout模拟有什么好处?

上次说了这两个定时器的缺点,这次聊聊互相模拟。

function mySetInterval(fn, t){
    let timer = null;
    function interval(){
        fn();
        timer = setTimeout(interval, t)
    }
    interval();
    return {
        clear: ()=>{
            clearTimeout(timer)
        }
    }
}
let a = mySetInterval(()=>{
    console.log('xxx')
},1000)
复制代码

说实话突然被问了一句有什么好处,我当时挺懵懵的。因为对定时器并不了解,只是会用而已。 后来研究了这俩“货”的生辰八字。上篇有讲到哦。后来有点作火入魔了。因为我知道了他俩的缺陷都是设置好的时间,在实际运行过程中有很多因素会影响回调函数执行的时机。既然已经知道了setInterval的缺点是不一定按时重复,有可能连续执行,有可能跳过某个回调函数。那setTimeout模拟就一定要解决这个问题,所以实现两个功能,第一在主线程中有定时器就不能添加新的定时器。第二就是在规定时间内重复执行回调函数。有什么好处应该就是这两个吧,有其他的我也想不出来了,有会的兄弟姐妹萌可以指点一发哦。感谢感谢。

那反过来模拟岂不美哉,执行一次setInterval就清除掉不就行了。我理解是这样的。

function mySetTimeout(fn, t){
    let timer = setInterval(()=>{
        fn();
        clearInterval(timer)
    },t)
}
let a = mySetTimeout(()=>{
    console.log('xxx')
},1000)
复制代码

这个呢并没有考虑穿参的情况。

文章分类
前端
文章标签