实现 mySetInterval
如题,我先是简单的实现了一下 mySetInterval
let mySetInterval = (callback, time) => {
let fn = () => {
return setTimeout(() => {
callback && callback();
fn();
}, time);
};
return fn();
};
mySetInterval(() => {
console.log(123);
}, 1000);
实现 mySetInterval
实现这个废了些功夫,但是还是不满意,因为下面几点原因
setTimeout用完之后,再次创建setTimeout的时候,返回的是新的类似id的一个对象,这时候你去clearTimeout是没用的,因为函数返回的是旧的idmySetInterval需要像setInterval方法返回一个类似id的一个对象,然后再调用myClearInterval传入这个id清除,但是你如果创建多个mySetInterval,他们需要具有唯一性。
然后我写了下面的方法,其中 intervalMap 是用来保存你新建的 mySetInterval 实例,具有唯一性。这个方法的缺点显而易见,要定义一个全局的 intervalMap 去保存。
我太菜了,只能这么写了。下面还有新方法,虽然可以不用定义全局 intervalMap,但是 mySetInterval 方法返回的不是和 setTimeout 类似的 id 的一个对象
第一个办法
const intervalMap = new Map();
let mySetInterval = (callback, time) => {
let timeoutFirst = null;
let fn = () => {
let newTime = setTimeout(() => {
callback && callback();
fn();
}, time);
if (!timeoutFirst) {
timeoutFirst = newTime;
}
intervalMap.set(timeoutFirst, newTime);
};
fn();
return timeoutFirst;
};
const myClearInterval = (params) => {
clearTimeout(intervalMap.get(params));
intervalMap.delete(params);
};
let time1 = mySetInterval(() => {
console.log(123);
}, 1000);
let time2 = mySetInterval(() => {
console.log(456);
}, 2000);
let time3 = mySetInterval(() => {
console.log(789);
}, 3000);
setTimeout(() => {
myClearInterval(time1);
myClearInterval(time2);
myClearInterval(time3);
}, 5000);
第二个办法
const mySetInterval = (callback, time) => {
let timer = {};
const fn = () => {
clearTimeout(timer);
timer = setTimeout(() => {
callback();
fn();
}, time);
};
fn();
return {
clear: () => {
clearTimeout(timer);
},
};
};
const myClearInterval = (timer) => {
timer.clear();
};
后记
自己是在是太菜了,短时间内没想出怎么样才能写出和 setInterval、clearInterval 实现一致的方法。
然后因为周六么,我群里请教的时候也没什么人。。有个大佬点评我代码太乱了,怎么把握去思考逻辑对不对的?
然后如果哪位朋友实现了可以联系我。。我想学习一下怎么写