每天焦虑着疫情赶紧过去,然后可以早点出去浪,所以每日都在关注最新进展,然后突然发现,生活处处是题目啊,这防抖和节流不就来了吗? 这一次再记不得,就过分了吧。
逆行者们辛苦了,你们是最棒的
防抖
场景
响应防疫要求,风险区解封需要遵循 14 天无新增才能解除封锁,且高风险区需要每天都进行核酸检测,一旦检测出阳性,那么就得再次坚持 14 天了;
小明现在处于风险区居家隔离,每天都刷一下新闻,看看是否有新增,但是每天都关注心力憔悴,消耗专注力,所以打算写一个程序,当程序叫他的时候,他就知道自己可以出门了;
分析
- 每一次出现检测出阳性(触发条件),都必须刷新需要居家的时间,直到在
一段时间(持续时间段 timer)内,再也没有出现疫情了,我们才能真正离家出去浪(回调函数 fn); - 所以我们入参是两个,fn 防抖函数, timer 时间段;返回值是一个锁定函数 lockFn, 每次触发 lockFn 的时候,就得重新居家了。
- 当然我们可以测试一下,设计一个随机值,假设有 10% 的几率会再检测出阳性,那么如果还在隔离的,刷新隔离时间,如果已经出去浪了,就得重新回来隔离;
- 我们将持续和新冠做斗争,加油
function debounced(fn, timer = 14 * 24 * 3600) {
let timeout; // 设置计时器,初始是 undefined
const lockFn = () => {
console.log("我的天啊,又要重新计算居家时间了");
// 每次调用 lockFn, 就刷新计时时间,重新隔离
timeout = setTimeout(() => {
fn();
}, timer);
};
return lockFn;
}
// 测试一下
const lockFn = debounced(() => {
console.log("解封了,可以去浪了!");
console.log("解封了,可以去浪了!");
console.log("解封了,可以去浪了!");
}, 1000);
interval = setInterval(() => {
const isBad = Math.random() * 10 > 9;
console.log(`看看今天的疫情情况:${isBad ? "有新增" : `无新增`}`);
if (isBad) {
// 有 10% 的机会检验处理
lockFn(interval);
}
}, 500);
节流
场景
现在要进行全小区的核酸检测,但是由于医务人员有限,所以无论有多少人问,在一定时间内,都只能进行一轮检测;
所以入参就是医务回应函数 fn, 一次检测需要的时间 timer, 返回的就是民众询问的 lockFn
无论有多少人去询问(触发 lockFn),在 timer 时间内,医务都忙着检测没空理你,直到一轮 timer 结束了,才会回应并进行下一轮的检测
// 节流 -- 一定时间内只一次
function throttle(fn, timer) {
let timeout;
const lockedFn = () => {
console.log('医生忙着检测,节省体力,并没有理会');
if (!timeout) {
timeout = setTimeout(() => {
fn(); // 执行完了
timeout = null;
}, timer);
}
};
return lockedFn;
}
// 测试一下
const lockFn = throttle(() => {
console.log("医生:这一批好了,下一个");
console.log(`-----`);
}, 1000);
interval = setInterval(() => {
console.log(`没过一阵子,就会有人询问:医生,好了么,到我们了吗?`);
lockFn(interval);
}, 500);