【场景应用题】使用 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;
}
相关推荐
程序员码歌6 分钟前
OpenSpec 到 Superpowers:AI 编码从说清到做对
android·前端·人工智能
爱编程的小新☆7 分钟前
LangGraph4j工作流框架
前端·数据库·ai·langchain·langgraph4j
@PHARAOH23 分钟前
HOW - 构建一个轻量前后端一体服务
前端·微服务·服务端
无限进步_34 分钟前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
一只小小Java35 分钟前
Echarts单表多图实现
前端·javascript·echarts
dunky44 分钟前
Spring AI 深度解析:把 LLM 抽象成 Spring Bean 的底层逻辑
前端
星栈1 小时前
Rust WASM 文件上传全链路:从浏览器到 S3,一个字节都不能少
前端·前端框架·开源
濮水大叔1 小时前
告别 Django Admin!这个 NodeJS 全栈框架让你在 DTO 中直接配置 Table/Form 渲染
前端·typescript·node.js
JarvanMo1 小时前
Flutter 3.44 & Dart 3.12重磅发布!这些新特性太香了
前端
竹林8181 小时前
用Viem替换ethers.js:一次合约交互的"减负"实战,我总算把TypeScript类型搞明白了
前端·javascript