【场景应用题】使用 setTimeout 实现 setlnterval

setlnterval 的作用是每隔一段指定时间执行一个函数,但是这个执行不是真的到了时间立即执行,它真正的作用是每隔一段时间将事件加入事件队列中去,只有当当前的执行栈为空的时候,才能去从事件队列中取出事件执行。所以可能会出现这样的情况,就是当前执行栈执行的时间很长,导致事件队列里边积累多个定时器加入的事件,当执行栈结束的时候,这些事件会依次执行,因此就不能到间隔一段时间执行的效果。

针对 setlnterval 的这个缺点,我们可以使用 setTimeout 递归调用来模拟 setlnterval,这样我们就确保了只有一个事件结束了,我们才会触发下一个定时器事件,这样解决了 setlnterval 的问题。

实现思路是使用递归函数,不断地去执行 setTimeout 从而达到 setInterval 的效果

scss 复制代码
function mySetInterval(fn, timeout) {
    // 控制器,控制定时器是否继续执行
    let timer = {
        flag: true
    }
    // 设置递归函数,模拟定时器执行
    function interval() {
        if (timer.flag) {
            fn();
            setTimeout(interval, timeout)
        }
    }
    // 启动定时器
    setTimeout(interval, timeout);
    // 返回控制器
    return timer;
}
相关推荐
风清云淡_A几秒前
【REACT16】react老项目版本依赖适配问题
前端·react.js
jump6802 分钟前
【react】 useEffect
前端
前端小咸鱼一条4 分钟前
16.React性能优化SCU
前端·react.js·性能优化
起风了___6 分钟前
Flutter 全局音频播放单例实现(附完整源码)——基于 just_audio 的零依赖方案
前端·flutter
im_AMBER6 分钟前
React 09
前端·javascript·笔记·学习·react.js·前端框架
用户4099322502127 分钟前
快速入门Vue模板里的JS表达式有啥不能碰?计算属性为啥比方法更能打?
前端·ai编程·trae
非专业程序员18 分钟前
HarfBuzz 实战:五大核心API 实例详解【附iOS/Swift实战示例】
前端·程序员
DreamMachine25 分钟前
Flutter 开发的极简风格音乐播放器
前端·flutter
前端老宋Running31 分钟前
前端防抖与节流一篇讲清楚
前端·面试
ejinxian34 分钟前
Rust UI 框架GPUI 与 Electron 的对比
前端·javascript·electron