下面是我用clearTimeout实现的一个clearInterval效果,
如何不用clearTimeout()、clearInterval()实现一个自定义的clearInterval()呢?
@小蓝阿姨 @Z_ One Dream
//myclearInterval
function myInterval(func, time) {
let ids = [];
function fn() {
let id = setTimeout(() => {
func();
fn();
}, time)
//console.log(id);
ids.push(id);
}
fn();
return ids;
}
function clearMyInterval(idList) {
idList.forEach((id) => {
clearTimeout(id);
//clearInterval(id)
})
}
function myclearInterval(id) {
setTimeout(() => {
clearMyInterval(id)
}, 0)
}
//-----------------------------------------
var num=0;
let id = myInterval(() => {
//document.write('Hello World');
num++;
if(num===5) myclearInterval(id)
//console.log(num);
// clearMyInterval(id)
console.log(num);
}, 1000)
1、setinterval的逻辑本身呢,他是将设定的任务存到内存中,并且添加定时任务,使其定时执行,这就是不建议用setinterval的意思;
2、而且setInteral在浏览器切换之后,还会继续执行,这也是造成内存泄漏的一个原因;
3、setinterval也可以表达为一个无限递归执行的函数
4、所以,要杀死他,意思就是使整个递归中增加了一层 中断 的判断,所以在自定义的这个setinterval中,中断判断是重点呗
如果是不想用clearTimeout()、clearInterval()中断一个定时器的话,目前好像还没有什么好的解决方案。
如果非要不用那个的话可以直接手动抛出一个异常throw new Error('time end')
,前提是你没有运行底下代码的需求。
有内置现成的不用,非要自己自定义去写?且不说你自己写的会不会比内置现成的好,哪怕你自己写,你要考虑很多情况,花的时间多就不说了吧,但你确定你能考虑到所有情况么?