重复调用
题目描述
实现下面的方法,使其在如下调用时,每 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;
}