可以使用节流(throttling)或者防抖(debouncing)来控制调用接口的频率。

节流指的是在一段时间内只允许函数执行一次,比如每隔 1 秒钟调用一次接口。可以使用 setTimeout 和 clearTimeout 来实现。

防抖指的是在函数调用后,等待一段时间,如果这段时间内没有再次调用函数,那么函数才会执行。比如用户在输入框中输入时,可以等待用户停止输入后再调用接口。可以使用 setTimeout 和 clearTimeout 来实现。

具体实现可以参考以下示例代码:

节流:

function throttle(func, delay) {let isThrottled = false;return function(...args) {if (!isThrottled) {func.apply(this, args);isThrottled = true;setTimeout(() => {isThrottled = false;}, delay);}};
}// 示例用法
function handleScroll() {console.log('Scroll event throttled');
}const throttleScroll = throttle(handleScroll, 300);
window.addEventListener('scroll', throttleScroll);

防抖

function debounce(func, delay) {let timerId;return function(...args) {clearTimeout(timerId);timerId = setTimeout(() => {func.apply(this, args);}, delay);};
}// 示例用法
function handleInput() {console.log('Input event debounced');
}const debounceInput = debounce(handleInput, 300);
document.getElementById('input').addEventListener('input', debounceInput);

以下是一个实际使用节流的例子,假设我们有一个搜索框,用户输入时会自动调用搜索接口:

const searchInput = document.getElementById('search-input');
const searchResults = document.getElementById('search-results');function search(query) {// 调用搜索接口,并更新搜索结果searchResults.innerHTML = '搜索中...';fetch(`/search?q=${query}`).then(response => response.text()).then(html => {searchResults.innerHTML = html;});
}// 每隔 500 毫秒调用一次搜索函数
searchInput.addEventListener('input', throttle(function() {search(searchInput.value);
}, 500));

以下是一个实际使用防抖的例子,假设我们有一个保存按钮,用户点击后会自动保存当前编辑的内容:

const saveButton = document.getElementById('save-button');
const editor = document.getElementById('editor');function saveContent() {// 调用保存接口fetch('/save', {method: 'POST',body: editor.value,});
}// 用户点击后等待 1 秒钟,如果用户在这段时间内再次点击,重新等待 1 秒钟
saveButton.addEventListener('click', debounce(function() {saveContent();
}, 1000));

这些例子都是基于 DOM 事件来触发节流和防抖的,实际使用中也可以根据具体的业务需求来调用节流和防抖函数。

选择使用节流(throttling)还是防抖(debouncing)取决于你的具体需求和场景。

  1. 使用节流:

  • 当你希望在一定时间间隔内稳定地执行函数,无论触发频率有多高。

  • 当你需要限制函数的执行频率,以防止过多的资源消耗或性能问题。

  • 适用于高频率事件,如滚动、拖拽、鼠标移动等。

  1. 使用防抖:

  • 当你希望在连续触发动作后的一段时间内只执行最后一次触发的动作。

  • 当你需要避免频繁触发动作导致的不必要的资源消耗或多次重复操作。

  • 适用于按钮点击、输入框输入、搜索等场景。

综合考虑以下几个因素可以帮助你做出选择:

  • 触发频率:观察事件的触发频率,如果触发频率非常高,可能需要使用节流来限制执行频率。

  • 实时性:如果你需要实时反馈用户操作,可以使用防抖来快速响应最后一次触发的动作。

  • 用户体验:根据用户的交互期望和场景需求,选择最适合的技术以提供最佳的用户体验。

需要注意的是,节流和防抖都是根据特定的时间间隔进行限制,因此根据实际需求和效果进行调整是很重要的。你也可以根据具体情况进行试验和调整,以获得最佳的效果和用户体验。

什么是节流(throttling)和防抖(debouncing)?相关推荐

  1. 经常可能会用到的【函数节流和函数防抖】记录下,做下区分

    今天突然被人问到,函数节流和函数防抖的区别是什么, 结果我脑子一热直接举了个滚动条的粟子说是优化高频率执行的手段,就记得自己是用setTimeout来实现的. 完了区别是什么??哪个是哪个都蒙B了 回 ...

  2. ege限制鼠标移动的函数_浅谈函数节流和函数防抖

    什么是函数节流和函数防抖?下面本篇文章就来给大家浅谈一下函数节流和函数防抖.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 前言 事件的触发权很多时候都属于用户,有些情况下会产生问题 ...

  3. vue 节流throttling防抖debounce

    节流和防抖常用与监听滚动事件,移动事件,窗口改变大小事件,输入事件等高频触发事件,当事件处理函数较为复杂时,将导致无法实时响应,降低用户体验度,影响效率,出现页面卡顿,假死等现象. debounce  ...

  4. 防抖(debounce) 和 节流(throttling)

    防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案. 在给DOM绑定事件时,有些事件我们是无法控制触发频率的. 如鼠标移动事件onmousemove, 滚动滚动条事件onscroll,窗口大小改 ...

  5. 防抖(debounce) 和 节流(throttling)的封装使用-最终发布npm

    函数的防抖节流 前言 防抖函数 防抖函数(雏形) 防抖函数1.0(使用了闭包) 防抖函数2.0(此版本开始才称得上是封装) 防抖函数3.0(希望第一次点击就立即触发) 防抖函数4.0(解决this指向 ...

  6. 防抖 节流_关于防抖和节流

    虾扯蛋之函数防抖和节流 - 掘金 先贴贴 这个哥们的. 因为我看了很多,感觉大多都是复制.没有啥思考 在介绍以下这些问题的时候.先公示下我思考的时候出现的问题 1.如果你使用 onclick 和 ad ...

  7. 【前端帮帮忙】第7期 关于节流(throttle)和防抖(debounce)的理解

    节流和防抖在我们平时的项目中挺常用的,也是面试中经常会被提问的知识点,今天我们一起来学习一下. 节流 简单理解就是:控制函数每隔n秒执行一次. 作用 防止用户高频率的触发事件,刚好这个事件又需要处理大 ...

  8. 事件触发控制_前端性能优化:事件的节流throttle与防抖debounce

    scroll 事件是一个非常容易被反复触发的事件,另外,resize 事件.鼠标事件(比如 mousemove.mouseover 等).键盘事件(keyup.keydown 等)都存在被频繁触发的风 ...

  9. JavaScript函数节流和函数防抖

    1.为什么需要函数防抖和函数节流? 在浏览器中某些计算和处理要比其他的昂贵很多.例如DOM操作比起非DOM交互需要更多的内存和CPU占用时间.连续尝试进行过多的DOM操作可能会导致浏览器挂起,甚至崩溃 ...

  10. JavaScript 函数节流 throttle 和防抖 debounce

    今天和别人聊到JavaScript函数的节流和防抖,发现自己对这两个的区别很是模糊,遂小小实践一下,在此记录,希望对需要的人有所帮助. 节流 - 频繁操作,间隔一定时间去做一件事 举例说明:假定时间间 ...

最新文章

  1. 强化学习环境库 Gym 发布首个社区发布版,全面兼容 Python 3.9
  2. 实现php a标签文件,HTML_如何点击a标签实现弹出input file上传文件对话框,html 复制代码代码如下: SPAN - phpStudy...
  3. P3805 【模板】manacher 算法【马拉车】
  4. HTTP协议(5)HTTP请求和响应
  5. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解
  6. JDK库rt包中常用包说明
  7. 2.27linux和windows互传文件
  8. 7-1 叶节点求和 (30 分)
  9. mysql表死锁查询
  10. SpringMVC第六篇【校验、统一处理异常】
  11. 计算机基础常见八股问题集合(含计算机网络,操作系统,计算机组成,数据结构与算法,数据库)
  12. 搭建STM32的开发环境
  13. Sonatype Nexus3 搭建私有仓库
  14. excel设置行高等于列宽_如何在Excel中设置行高和列宽
  15. oracle 朱志辉_甲骨文(Oracle)授权教育中心落户我校
  16. python标准库模块路径_Python3的系统标准库pathlib模块的 Path 对路径的操作会更简单...
  17. (十 八)张量场函数对矢径的导数、梯度
  18. OFD开发系列(一)-添加水印
  19. 如何解决Mac只能登QQ不能联网
  20. php-过滤不可见零宽的字符\u200B

热门文章

  1. Java毕业设计 社区疫情防控管理系统
  2. access中的IIf函数
  3. JavaSE-Lambada
  4. [31期]命运掌握在自己手中
  5. [前端基础] JavaScript 进阶篇
  6. fc天使之翼2020修改版下载_(安卓游戏)闲置超市大亨无限金钱版、模拟经营——安卓游戏下载资讯攻略信息...
  7. Java 集合之SortedSet和SortedMap
  8. 使用Python预测黄金AU9999收盘价
  9. ueditor编辑器右键粘贴、复制不能用的解决办法
  10. SNAT与DNAT详解