跳到主要内容

重复调用

题目描述

实现下面的方法,使其在如下调用时,每 3 秒输出 hello world 一次,共输出 4 次。

repeat(console.log, 4, 3000)('hello world');

解法一:setInterval 实现

思路

可以使用 setInterval 来实现。具体来说,可以定义一个函数 repeat,该函数接收一个函数 fn、一个数字 times 和一个时间间隔 interval,返回一个函数,该函数接收一个参数 args,并在 interval 时间间隔内调用 fntimes 次。

代码

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 时间间隔内调用 fntimes 次。

代码

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;
}