在《JavaScript高級程序設計》一書中,列舉了兩條setInterval()的缺點:segmentfault
某些間隔會被跳過;函數
多個定時器的代碼執行之間的間隔可能會比預期的小。設計
書中給出了替代方案:鏈式調用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~20
。io
轉載請註明出處:http://www.javashuo.com/article/p-etigmdtl-bc.htmlconsole
文章不按期更新完善,若是能對你有一點點啓發,我將不勝榮幸。function