在《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