执行可取消的延迟函数


1.题目描述

现给定一个函数 fn ,一个参数数组 args 和一个以毫秒为单位的超时时间 t ,返回一个取消函数 cancelFn 。

在经过 t 毫秒的延迟后,应该调用 fn 函数,并将 args 作为参数传递。除非 在 t 毫秒的延迟过程中,在 cancelT 毫秒时调用了 cancelFn。并且在这种情况下,fn 函数不应该被调用。

2.思路

定义一个 cancellable 函数,该函数接受 fn(函数)、args(参数数组)和 t(延迟时间)作为参数,并返回一个取消函数 cancelFn。

创建一个延迟计时器 timer,在 t 毫秒后调用传入的 fn 函数,并将 args 作为参数传递。然后,返回一个函数,该函数会在调用时清除 timer,从而取消定时调用 fn。

1
2
3
4
5
6
const timer = setTimeout(() => {
fn(...args);
}, t);
return () => {
clearTimeout(timer);
};

3.类似题目间隔取消

现给定一个函数 fn,一个参数数组 args 和一个时间间隔 t,返回一个取消函数 cancelFn。

函数 fn 应该立即使用 args 调用,并且在每个 t 毫秒内再次调用,直到调用 cancelFn。

1
2
3
4
5
fn(...args);
const timer = setInterval(fn, t, ...args);
return () => {
clearInterval(timer);
};