参考文章 https://blog.csdn.net/b954960630/article/details/82286486
setTimeout 延迟一段时间执行一次 (Only one);用clearTimeout()终止
setTimeout(function(){··· }, n); // n毫秒后执行function
setInterval 每隔一段时间执行一次 (Many times);用clearInterval()终止
setInterval(function(){··· }, n); // 每隔n毫秒执行一次function
注:setTimeout和setInterval的回调函数,都是经过n毫秒后被添加到队列中,而不是过n毫秒后立即执行。
综上所述,setInterval有两个缺点:
使用setInterval时,某些间隔会被跳过;
可能多个定时器会连续执行;
可以这么理解:每个setTimeout产生的任务会直接push到任务队列中;而setInterval在每次把任务push到任务队列前,都要进行一下判断(看上次的任务是否仍在队列中)。
因而我们一般用setTimeout模拟setInterval,来规避掉上面的缺点。
setTimeout模拟setInterval
setTimeout(function () {
// 任务
setTimeout(arguments.callee, interval);
}, interval)
setTimeout(function f() {
// 任务
setTimeout(f, interval);
}, interval)
//清除循环
setTimeOut(function ()) {
if (flag) {
setTimeOut(arguments.callee, interval)
}
}
关于this指向问题
setIntervalMethod(func: { call: (arg0: null) => void; }, t: number | undefined){
const inter = function(){
setTimeout(inter, t);
}
setTimeout(inter, t);
}
this.startMethod = setIntervalMethod(() =>{
this.request.get(config.url, config.params)
}, config.time);
return this.startMethod
class Test {
timeOut () {
setTimeOut(() => {
this.timeOut()
}, 1000)
}
}
let t = new Test()
t.timeOut()