防抖和节流

发布于 2023-05-04 19:28:47 字数 1627 浏览 60 评论 0

防抖

最基础版本

function debounce(fn, wait) {
  let timer;
  return function () {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, wait);
  };
}

立即触发和取消

function debouncePro(fn, wait, immediate = false) {
  let timer;

  function _debounce() {
    if (immediate && !timer) {
      fn.apply(this, arguments);
      timer = setTimeout(() => {
        timer = null;
      }, wait);
      return;
    }

      clearTimeout(timer);
      timer = setTimeout(() => {
        fn.apply(this, arguments);
        timer = null;
      }, wait);
    
  }
  _debounce.cancel = function () {
    clearTimeout(timer);
    timer = null;
  };

  return _debounce;
}

// test
const timer = (wait) => new Promise((resolve) => setTimeout(resolve, wait));

const fn = debouncePro(() => console.log(111), 1000, true);

async function main() {
  fn();
  console.log('第1次');
  await timer(1000)
  fn();
  console.log('第2次');
  await timer(400)
  fn();
  fn();
  console.log('第3次延后触发');

}

main();

节流

function throttle(fn, wait) {
    let timer 
    return function() {
        if(timer) {
            return 
        }
        timer = setTimeout(() => {
            fn.apply(this, arguments)
            timer = null
        }, wait);
    }
}
const timer = (wait) => new Promise((resolve) => setTimeout(resolve, wait));

const log = throttle(console.log.bind(console),1000)



async function main() {
    log(11);
  await timer(1000)
  log(222);
  await timer(400)
  log(222);

}
main()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
22 人气
更多

推荐作者

qq_eQNo9e

文章 0 评论 0

内心旳酸楚

文章 0 评论 0

mb_BlPo2I8v

文章 0 评论 0

alipaysp_ZRaVhH1Dn

文章 0 评论 0

alipaysp_VP2a8Q4rgx

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文