改进后的 setInterval

/*
  功能:
    改进后的 setInterval,内部由 setTimeout 实现
    间隔时间为两次 function 开始和结束之间的时间,而不是两次开始的间隔时间
    具体区别请参见这篇文章:《JS中不要使用setInterval的原因分析》http://hzy.pw/p/1847
  参数:
    function:要执行的函数
      接受参数 int:第几次执行
      返回值为 false 则中断循环,否则继续循环
      返回值为整数,则设定为下次循环的间隔时间
    int:默认间隔时间,单位毫秒
  返回值:
    handle, 用于传给 loop_stop() 终止循环
  版本:
    1.3.1.5
    2016年8月25日
*/
var loop_handles = {};
function loop(fun, delay) {
    var times = 0,
        handle = 'hzy' + Math.random();
    loop_handles[handle] = true;



    function inner() {
        if (loop_handles[handle]) {
            let ret = fun(++times);
            if(parseInt(ret) === ret)
                setTimeout(inner, ret);
            else if(ret!==false)
                setTimeout(inner, delay);
            else
                delete loop_handles[handle];
        }
    }
    inner();

    return handle;
}
/*
    接受 loop 返回的 handle 用于终止循环
    终止成功返回 true
*/
function loop_stop(handle) {
    return delete loop_handles[handle];
}
export { loop_stop, loop };

发布者

胡中元

《中原驿站》站长

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注