疫情防控下的防抖和节流

242 阅读3分钟

每天焦虑着疫情赶紧过去,然后可以早点出去浪,所以每日都在关注最新进展,然后突然发现,生活处处是题目啊,这防抖和节流不就来了吗? 这一次再记不得,就过分了吧。

逆行者们辛苦了,你们是最棒的

防抖

场景

响应防疫要求,风险区解封需要遵循 14 天无新增才能解除封锁,且高风险区需要每天都进行核酸检测,一旦检测出阳性,那么就得再次坚持 14 天了;

小明现在处于风险区居家隔离,每天都刷一下新闻,看看是否有新增,但是每天都关注心力憔悴,消耗专注力,所以打算写一个程序,当程序叫他的时候,他就知道自己可以出门了;

分析

  1. 每一次出现检测出阳性(触发条件),都必须刷新需要居家的时间,直到在一段时间(持续时间段 timer)内,再也没有出现疫情了,我们才能真正离家出去浪(回调函数 fn);
  2. 所以我们入参是两个,fn 防抖函数, timer 时间段;返回值是一个锁定函数 lockFn, 每次触发 lockFn 的时候,就得重新居家了。
  3. 当然我们可以测试一下,设计一个随机值,假设有 10% 的几率会再检测出阳性,那么如果还在隔离的,刷新隔离时间,如果已经出去浪了,就得重新回来隔离;
  4. 我们将持续和新冠做斗争,加油
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);