Skip to content

使用 setTimeout 和 clearTimeout 模拟 setInterval 和 clearInterval

Published: at 08:39 AMSuggest Changes

实现 mySetInterval

如题,我先是简单的实现了一下 mySetInterval

let mySetInterval = (callback, time) => {
  let fn = () => {
    return setTimeout(() => {
      callback && callback();
      fn();
    }, time);
  };
  return fn();
};

mySetInterval(() => {
  console.log(123);
}, 1000);

实现 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();
};

后记

自己是在是太菜了,短时间内没想出怎么样才能写出和 setIntervalclearInterval 实现一致的方法。

然后因为周六么,我群里请教的时候也没什么人。。有个大佬点评我代码太乱了,怎么把握去思考逻辑对不对的?

然后如果哪位朋友实现了可以联系我。。我想学习一下怎么写


Previous Post
JSONP 与 CSP 的探究
Next Post
JS 常见的拷贝方法,手写一个深拷贝