首页 > 其他分享 >函数的防抖与节流实现

函数的防抖与节流实现

时间:2022-10-28 22:33:09浏览次数:43  
标签:防抖 定时器 const 节流 timer fn isDone 函数

一、什么是节流函数,什么是防抖函数,它们之间的区别是什么?

·节流函数:节流,可以理解为节省流量。当一个请求被用户在短时间内不停点击时(用户频繁发送一个数据请求),为了减轻服务器压力,需要设定一个时间,使得在规定的这个时间内,无论用户请求了多少次,就当一次执行。例子:玩游戏回城按钮按多次等于按一次。

·防抖函数:抖,即抖动。当用户使用搜索框时,输入一个内容就发送一次请求,继续输入则会继续发送(用户一直在发送多个不同的请求),为了防止这种情况发生,应在用户输入结束后延时发请求,而不是同步发送。

·区别:节流函数是将多个重复的请求在规定的时间内执行一次,防抖是将一段时间内不停被执行的不同请求,延迟规定的时间后再执行。

二、节流函数与防抖函数的实现。

1.节流函数

//创建一个节流函数

 

2.防抖函数

//1.创建一个基础的防抖函数

function debounce(fn, delay) {     //定义一个定时器,保存上一次的定时器     const timer = null;
    //执行函数     const doDebounce = function () {         //取消上一次的定时器         if (timer) {             clearTimeout(timer)         }         //延迟执行         timer = setTimeout(() => {             //外部传入的请求函数             fn()         }, delay)     }     return doDebounce }   // 2.使用this和多个参数实现 function debounce(fn, delay,) {     //定义一次定时器,保存上一次的定时器     const timer = null
    //真正执行的函数     const doDebounce = function (...args) {         //取消上一次的定时器         if (timer) clearTimeout(timer)
        //延迟执行,参数不止一个,采用展开语法         timer = setTimeout(() => {             //外部传入真正要执行的函数             fn.apply(this, args)         }, delay)     }
    return doDebounce }   //3.在this的基础上判断是否立即执行 function debounce(fn, delay, immediate = false) {     //定义一个定时器,保存上一次的定时器     const timer = null     const isDone = false
    //真正执行的函数     const doDebounce = function (...args) {         //取消上一次的定时器         if (timer) clearTimeout(timer)
        //是否立即执行         if (immediate && !isDone) {             //即外部传入的immediate为真,则立即执行             fn.apply(this, args)             isDone = true         }         else {             //延迟执行,参数不止一个,使用展开语法             timer = setTimeout(() => {                 //外部传入执行函数                 fn.apply(this, args)                 isDone = false             }, delay)         }     }     return doDebounce }
//4.在是否立即执行的基础上加入取消功能 function debounce(fn, delay, immediate = false) {     //定义定时器,保存上一个     const timer = null     const isDone = false
    //真正执行函数     const doDebounce = function (...args) {         //清除上一个定时器         if (timer) clearTimeout(timer)
        //是否立即执行         if (immediate && !isDone) {             fn.apply(this, args)             isDone = true         }         else {             //延迟执行             timer = setTimeout(() => {                 fn.apply(this, args)                 isDone = false             }, delay)         }     }
    //取消,由于函数也可作为对象使用,故添加一个重置函数     doDebounce.cancel = function () {         if (timer) clearTimeout(timer)         timer = null         isDone = false     }
    return doDebounce }   //5.在加入取消功能上添加返回值 function debounce(fn, delay, immediate = false) {     //定义定时器,保存上一个     const timer = null     const isDone = false
    //真正执行函数     const doDebounce = function (...args) {         //添加一个Promise对象         return new Promise((resolve, reject) => {             //清除上一个定时器             if (timer) clearTimeout(timer)
            //是否立即执行             if (immediate && !isDone) {                 //使用Promise的成功回调将其返回                 const result = fn.apply(this, args)                 if (result) resolve(resolve)                 isDone = true             }             else {                 //延迟执行                 timer = setTimeout(() => {                     //调用Promise的失败回调返回结果                     const result = fn.apply(this, args)                     if (result) reject(result)                 }, delay)             }
        })     }     //取消,由于函数也可作为对象使用,故添加一个重置函数     doDebounce.cancel = function () {         if (timer) clearTimeout(timer)         timer = null         isDone = false     }     return doDebounce }


 

标签:防抖,定时器,const,节流,timer,fn,isDone,函数
From: https://www.cnblogs.com/jackdongdong/p/16837625.html

相关文章

  • 一文带你了解Java中的Scanner键盘输入关键字、random 随机数关键字、System类和匿名函
    Scanner键盘输入Scanner类的功能:可以实现键盘输入数据,到程序当中。引用类型的一般使用步骤:1.导包import包路径.包名称如果需要使用目标类,和当前类位于同一个包下,......
  • 【笔记05】Javascript - 基本概念 - (函数递归)
    先看一个试题: 求n的阶乘通常,我们会写:functionfac(num){varres=1;for(vari=1;i<=num;i++){res*=i;}returnres;}观察阶乘可以发现两个特点:特点一:......
  • Matlab 之 find()函数
    Matlab之find()函数 当我第一次用matlab语言编写一个工程项目时,发现自己编写的脚本里循环特别多,导致编程效率很低,这让我特别苦恼。有一次导师让我阅读他编写的......
  • 【CFgym102482D】Gem Island(生成函数)
    题意:有一个序列\(a_1,\cdots,a_n\),初始时它们全为\(1\)。进行\(d\)轮操作:每轮操作以正比于\(a\)的概率选择一个\(a_i\)加\(1\)。求最后\(a_1,\cdots,a_n\)中前......
  • Javascrip内置函数--计时器
    延时执行:setTimeout()  setTimeout的三种写法:console.log(1);/***第一个参数是代码,注意代码需用引号包裹,否则会立即执行代码*第二个参数是1000,即1000ms......
  • 【bzoj4869】【六省联考2017】相逢是问候(扩展欧拉函数)
    和《花神游历各国》有异曲同工之妙。首先能想到扩展欧拉定理:\[a^b\equiv\begin{cases}a^{b\bmod\varphi(p)+\varphi(p)}&\text{if}b\geq\varphi(p)\\a^b&\text{if}......
  • vue 中watch 回调函数和methos中方法的区别
    1.vue中代码<el-inputv-model="searchkey"placeholder="键名"@input="handleInput"clearablestyle="max-width:300px;"></el-/utils/commonwen文件加下export......
  • 常用的Python函数有几类
    今天就给大家介绍12类,新手在做写代码的时候容易卡壳,尤其当接触的函数以及其他知识比较多的时候,经常会看完需求之后不知道自己该用什么方法来实现它,实现的逻辑可能你有,但怎么......
  • 010001 三角函数
    <?phpheader('Content-Type:text/html;charset=utf-8');include'./assets/php/head.php';echo'30度角的正弦值为:';echosin(deg2rad(30));echo'&nbsp;&nbsp;&......
  • js函数的几种写法,闭包函数的写法
    最常见的写法://声明一个函数functionfoo(){alert('hi,js');}//调用函数foo();匿名函数写法:varfoo=function(){alert('hi,js');}......