【JavaScript】定时器清除之后回调定时器

在《JavaScript高级程序设计》一书中,列举了两条setInterval()的缺点:segmentfault

  1. 某些间隔会被跳过;函数

  2. 多个定时器的代码执行之间的间隔可能会比预期的小。设计

书中给出了替代方案:链式调用setTimeout()。因此我如今更倾向于使用setTimeout()。code

链式调用setTimeout()的模式:ip

setTimeout(function(){
    //todo
    setTimeout(arguments.callee, delay);
}, delay);

下面是实现定时器清除之后回调定时器的一段伪代码:get

function callbackTimer(..., fn) {
    return function() {
        setTimeout(function() {
            if (...) {
                //todo
                setTimeout(arguments.callee, delay);
            } else if (fn instanceof Function) {
                fn();
                fn = null;
            }
        }, delay)
    };
}

看一段实例:count函数实现数字从min增长到max,每增长一次在控制台打印一次。结束之后能够当即执行回调函数。回调函数

function count(min, max, delay, fn) {
    return function() {
        setTimeout(function() {
            if (min <= max) {
                console.log(min++);
                setTimeout(arguments.callee, delay);
            } else if (fn instanceof Function) {
                fn();
                fn = null;
            }
        }, delay);
    };
}
var count2 = count(11, 20, 500);
var count1 = count(1, 10, 200, count2);
count1();

在控制台内先以0.2s一次的频率打印1~10,以后再以0.5s一次的频率打印11~20io


转载请注明出处:http://www.javashuo.com/article/p-etigmdtl-bc.htmlconsole

文章不按期更新完善,若是能对你有一点点启发,我将不胜荣幸。function

相关文章
相关标签/搜索