• 用 setTimeout 实现 setInterval


    window.idarr = [0];
    function _setInterval(fun, time) {
        var id = setTimeout(function() {
            _setInterval(fun, time);
            fun();
            clearTimeout(id);
        }, time);
        window.idarr.pop();
        window.idarr.push(id);
        return window.idarr;
    }
    function _clearInterval(id) {
        clearTimeout(id[0]);
    }
    

    因为 setInterval 是setTimeout 实现,所以 clearInterval 也要用 clearTimeout 实现。但是 setInetrval 应该返回的是一个数字,这里就有点为难了,因为它必须返回的是正在执行的 setTimeout 函数的计时器编码,没办法。我只能用数组去存储这个 id,因为 return window.idarr 返回的是内存地址,直接操作 idarr 数组,自然就可以接收当前的计时器编码。不知道有啥其他的好法子。

    还有一个问题想不明白,为啥编码没有 “2” 呢?

    window.idarr = [];
    function _setInterval(fun, time) {
        var id = setTimeout(function() {
            _setInterval(fun, time);
            fun();
            clearTimeout(id);
        }, time);
        window.idarr.push(id);
        return window.idarr;
    }
    
    function _clearInterval(id) {
        clearTimeout(id.slice(-1)[0]);
    }
    
    var count = 0;
    var timerId = _setInterval(function() {
        count++;
        console.log(timerId);
        if(count==10){
            _clearInterval(timerId);
        }
    }, 1000);
    

    执行结果:

    为啥没有 ”2“ 呢?

  • 相关阅读:
    BZOJ2565:最长双回文串
    BZOJ2342:[SHOI2011]双倍回文
    Redis数据库基础操作
    Celery异步任务框架
    Django框架之缓存数据库
    drf 分页器组件
    drf jwt认证组件
    drf三大认证组件
    Django框架之RBAC+ContentType
    Django框架之admin管理后台
  • 原文地址:https://www.cnblogs.com/arduka/p/13337018.html
Copyright © 2020-2023  润新知