【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

相關文章
相關標籤/搜索