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

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

  1. 某些间隔会被跳过;

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

书中给出了替代方案:链式调用setTimeout()。所以我现在更倾向于使用setTimeout()。

链式调用setTimeout()的模式:

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

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

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~20


转载请注明出处:https://segmentfault.com/a/1190000004639491

文章不定期更新完善,如果能对你有一点点启发,我将不胜荣幸。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值