重复调用
题目描述
实现下面的方法,使其在如下调用时,每 3 秒输出 hello world 一次,共输出 4 次。
repeat(console.log, 4, 3000)('hello world');
解法一:setInterval 实现
思路
可以使用 setInterval 来实现。具体来说,可以定义一个函数 repeat,该函数接收一个函数 fn、一个数字 times 和一个时间间隔 interval,返回一个函数,该函数接收一个参数 args,并在 interval 时间间隔内调用 fn 共 times 次。
代码
type Callback = (...args: any[]) => any;
export function repeat<T extends Callback>(cb: T, times: number, interval: number): T {
return ((...args: Parameters<T>) => {
let i = 0;
const intervalId = setInterval(() => {
cb(...args);
if (++i === times) {
clearInterval(intervalId);
}
}, interval);
}) as T;
}
解法二:setTimeout + async/await 实现
思路
repeat,该函数接收一个函数 fn、一个数字 times 和一个时间间隔 interval,返回一个函数,该函数接收一个参数 args,并在 interval 时间间隔内调用 fn 共 times 次。
代码
function sleep(ms: number) {
return new Promise<number>(resolve => {
setTimeout(() => {
resolve(0);
}, ms);
});
}
type Callback = (...args: any[]) => any;
export function repeat<T extends Callback>(cb: T, times: number, interval: number): T {
return (async (...args: Parameters<T>) => {
for (let i = 0; i < times; i++) {
cb(...args);
await sleep(interval);
}
}) as T;
}