【场景应用题】使用 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;
}
相关推荐
独自破碎E4 分钟前
【面试真题拆解】Spring事务机制
java·spring·面试
程序员爱钓鱼5 分钟前
Go PDF处理利器: github.com/pdfcpu/pdfcpu 深度指南
后端·面试·go
我命由我123456 分钟前
Element Plus 2.2.27 的单选框 Radio 组件,选中一个选项后,全部选项都变为选中状态
开发语言·前端·javascript·html·ecmascript·html5·js
Luna-player8 分钟前
第3章 Spring Boot的Web应用支持,个人学习笔记
前端·spring boot·学习
bugcome_com9 分钟前
【ASP.NET Web Pages】页面布局核心实战:从复用性到安全性,打造一致化网站界面
前端·后端·asp.net
Sylus_sui9 分钟前
Class 模型 + 跨组件状态(@Observed)+ 网络请求封装 + 本地存储全部是鸿蒙 Next/Stage 模型标准写法
前端
代码栈上的思考12 分钟前
消息队列持久化:文件存储设计与实现全解析
java·前端·算法
踩着两条虫19 分钟前
去“AI味儿”实操手册:从“机器脸”到“高级脸”,只差这三步!
前端·vue.js·ai编程
江湖十年21 分钟前
使用 testing/synctest 测试并发代码
后端·面试·go
qq_2113874729 分钟前
基于LangGraph多agent
开发语言·前端·javascript·agent·langgraph