以下为ChatGPT自动生成的解答,正确与否请自行判断。 也许你也可以从大家的发帖中找到想要的答案!
BFE.devAI解答 - JavaScript 代码题
83. 实现一个interval
思路:
实现一个 interval 时间间隔函数,和普通的 interval 不同的是,interval 时间间隔是一个线性函数,需要用到 delay 和 period 两个参数,返回一个 id,用于 clearInterval 的停止。
-
设置存储 id 的 count 和存储 callback 的 queue 数组。
-
利用 setTimeout 函数递归执行 callback,每次 callback 执行后 delay+period,同时存储当前 setTimeout 返回的 id。
-
实现 clearInterval,通过清除之前存储的 setTimeout 的 id 即可停止 setInterval 的执行。
代码实现:
let count = 0;
let queue = [];
function mySetInterval(callback, delay, period) {
let timeoutId = setTimeout(function () {
callback();
count++;
queue.push(setTimeout(arguments.callee, delay + count * period));
}, delay);
queue.push(timeoutId);
return timeoutId;
}
function myClearInterval(id) {
clearTimeout(id);
queue = queue.filter(function (timeoutId) {
return timeoutId != id;
});
}
let prev = Date.now();
const func = () => {
const now = Date.now();
console.log("roughly ", Date.now() - prev);
prev = now;
};
const id = mySetInterval(func, 100, 200);
setTimeout(() => {
myClearInterval(id);
}, 3000);
测试通过。