我有这些代码片段做同样的事情,但使用不同的方法 - setInterval和连续的setTimeout调用:
function log() {
console.log('fn')
}
//option 1
var forTimes = 10;
var doneTimes = 0;
var interval = setInterval(function(){
if (doneTimes < forTimes) {
log();
doneTimes++;
} else {
clearInterval(interval);
}
}, 100);
//option 2
function timeoutFn() {
if (doneTimes < forTimes) {
log();
doneTimes++;
setTimeout(timeoutFn, 100);
}
}
setTimeout(timeoutFn, 100);
由于单线程javascript的性质,setTimeout
和setInterval
都不能保证函数调用100毫秒,因为线程可能忙于运行事件处理程序或进行重排/重绘。我想知道他们中是否有人在指定时间内执行处理程序的可能性更大?如果是这样,为什么? setInterval
是否像setTimeout
一样,它等待指定的时间间隔传递,并且只有在此之后才将队列添加到队列中?
答案 0 :(得分:2)
setInterval现在被认为是一种不好的做法,因为无论先前对该函数的调用是否已完成,都会有一个间隔执行的函数。
关于确切的时间,既不好也不坏。
最好的方法是做一个递归的setTimeout模式:
var count = 0;
(function loopsiloop(){
setTimeout(function(){
if(count < 10) {
loopsiloop();
}
++count;
}, 100);
})();