552

有人能简单地给我解释一下出于速率限制目的对函数进行节流和去抖动之间的区别吗?

在我看来,这两个人做的事情似乎都一样。我已经查看了这两个博客以了解情况,但我仍然无法理解。

http://remysharp.com/2010/07/21/throttling-function-calls(网址:http://remysharp.com/2010/07/21/throttling-function-calls)

http://benalman.com/projects/jquery-trottle-debounce-plugin/

6

27个答案27

重置为默认值
693

简单来说:

  • 节流将延迟执行函数。它将减少多次触发事件的通知。
  • 辩论将对函数的一系列连续调用组合成对该函数的单个调用。它确保对多次触发的事件发出一个通知。

你可以直观地看到差异在这个演示中,它显示了基于鼠标移动的去抖vs节流事件何时触发。

如果您有一个经常被调用的函数,例如当发生调整大小或鼠标移动事件时,可以多次调用它。如果你不想这样做,你可以节气门这样可以定期调用函数。辩论这意味着它将在一系列事件的末尾(或开始)被调用。

11
  • 18
    我认为thriqon的可视化链接显示了它的工作原理。如果您有一个函数被多次调用,例如,当发生调整大小或鼠标移动事件时,它可以被多次调用。如果您不想这样做,可以对其进行节流,以便定期调用该函数。辩论意味着它将在一系列通话的末尾(或开始)被调用。
    – 多纳尔
    评论 2014年9月23日9:45
  • 1
    那么,去抖是不是只是用更长的延迟节流? 评论 2014年12月4日18:48
  • 25
    @亚当姆。查看可视化效果在这里
    – 多纳尔
    评论 2014年12月4日21:08
  • 2
    你从..开始。。“节流将延迟执行函数。”最后你会说“用去抖法你是在拖延执行”…我以为我们在谈论差异。。?
    – 时间
    评论 2015年11月16日5:57
  • 7
    @亚当姆。不可以。您可以通过在演示,并每隔一段时间停止鼠标移动。防反弹条将“勾选”之后您停止了所有鼠标移动,而油门杆将继续“滴答”作响虽然鼠标正在移动,但速度减慢了。 评论 2016年11月11日14:53
244

就我个人而言消除颤抖难以理解节气门.

因为这两个函数都可以帮助您推迟和降低某些执行的速度。假设您反复调用节流/去抖动返回的修饰函数。。。

  • 节气门:原始函数在指定的时间段内最多调用一次。
  • 辩论:原始函数将在调用方在指定的时间段后停止调用修饰函数.

我发现放松的最后一部分对于理解它试图实现的目标至关重要。我还发现_.deboush的旧版本实现有助于理解https://davidwalsh.name/function-debounce网站).

//返回一个函数,只要它继续被调用,就不会//被触发。函数停止调用后将被调用//N毫秒。如果传递了“immediate”,则在//前缘,而不是后缘。_.deboush=函数(func,wait,immediate){var超时;返回函数(){var上下文=此,args=参数;var later=函数(){超时=空;if(!immediate)func.apply(context,args);};var callNow=立即&&!超时;clearTimeout(超时);timeout=setTimeout(稍后,等待);if(callNow)func.apply(context,args);};};

这是一个牵强的比喻,但也许也有帮助。

你有一个叫Chatty的朋友,他喜欢通过IM与你聊天。假设当她说话时,她每5秒发送一条新消息,而你的IM应用程序图标上下跳动,你可以接受。。。

  • 天真方法:只要消息到达,就检查每条消息。当应用程序图标反弹时,请选中。这不是最有效的方法,但你总是最新的。
  • 节气门方法:每5分钟检查一次(如果有新的)。当新消息到达时,如果您在过去5分钟内的任何时候进行了检查,请忽略它。使用这种方法可以节省时间,同时仍在循环中。
  • 辩论方法:你知道Chatty,她把整个故事分解成几部分,用一条接一条的信息发送出去。你要等到Chatty写完整个故事:如果她停止发送消息5分钟,你会认为她已经写完了,现在你检查一下。
0
240

差异

节气门开度1秒。 退抖1秒。
延迟 没有延误 1秒延迟
如果……,则发出新消息。。。 已经过了1秒
自上次输出以来
在最后一次输入之后,
以下1秒没有新输入

用例说明

  • 搜索栏:不想在用户每次按下键时都进行搜索吗?想在用户停止输入1秒后进行搜索吗?使用消除颤抖按键1秒。

  • 射击游戏:手枪在每次射击之间需要1秒的时间,但用户在1秒内多次单击鼠标。使用节气门鼠标单击可确保过早的单击被忽略。

颠倒他们的角色

  • 在搜索栏上限制1秒:如果用户键入“abcdefghij”,每个后续字符每隔0.6秒键入一次,则节气门将在第一次按下“a”时触发。然后,它将在接下来的1秒内忽略每次按下;即0.6秒标记处的“b”将被忽略。然后,1.2秒时的“c”将再次触发搜索,然后再次重置时间,依此类推,以获取后续按键(例如,1.8秒的“d”将被忽略,但2.4秒的“e”将被触发,等等)。

  • 辩论手枪1秒:当用户看到敌人时,他会单击鼠标,但不会射击。他会在那一秒钟内再次点击几次,但仍不会射门。只有在停止咔嗒声整整一秒钟后,手枪才会最终射出一枪。

“现实生活”比较

酒吧外面有一些警卫。警卫允许一个人在酒吧里说“我想进去”。这是正常情况。任何说“我想进去”的人都可以进入酒吧。

现在有一个油门防护装置(油门5秒). 他喜欢最先回应的人。任何先说“我会去”的人,他都会让那个人进去。然后他拒绝了每一个人5秒在那之后,任何人先说都会被允许,其他人下一次都会被拒绝5秒.

还有一个卫兵防抖保护装置(去抖动5秒). 他喜欢给他带来精神休息的人5秒因此,如果有人说“我要走”,警卫就会等待5秒如果在这5秒内没有其他人打扰他,他会让第一个人进去。但是,如果有人插嘴说“我会去”5秒,他将拒绝第一个,然后再次启动5秒等待,这次是第二个人。如果5秒钟过去了,没有中断第二会让人进来,但不会让第一个人进来。

8
  • 4
    解释得很清楚!
    – 叶夫金
    评论 2022年10月8日10:42
  • 如果两个人来了,第二个一个一个。油门管理员不应该让第二个人在他到达4秒后过来吗?(最终不会失去那个人) 评论 2022年12月16日10:54
  • 2
    @Rivenfall Throttle and Deboush是为了降低噪音而设计的,所以它们是为了减少一些人的伤亡。他们有不同的人员流失策略。你要找的是延迟运算符[rxjs.dev/api/operators/delay]。这只会延迟他们的反应。延迟高德将是正常的守卫,只是对他来说,语音处理需要5秒。因此,除了5秒的延迟外,将允许所有延迟。 评论 2022年12月17日7:03
  • 1
    这不太正确。辩论可以随时进行,也可以不拖延。如果你直接去抖动你的函数,就会有延迟。要无延迟地解抖函数,请写入如果旗帜为true,运行我的函数,然后设置旗帜到false,然后解抖将标志设置回true的语句。也许还有一个词可以用来形容这个,而不是“放松”? 评论 2022年12月20日22:21
  • 1
    在我看来,这应该是最赞成的。 评论 2023年11月30日20:17
117

油门(1秒):你好,我是一个机器人。只要你一直打我,我就会一直和你说话,但每次都要一秒钟。如果你在一秒钟之前打电话给我回复,我仍然会每隔一秒钟回复你。换句话说,我只是喜欢每隔一段时间回复。

脱抖(1秒):嗨,我是那个机器人的堂兄。只要你一直给我打电话,我就会保持沉默,因为我喜欢在1秒后回复自从你上次打电话给我。我不知道是因为我的态度有问题还是因为我不喜欢打断别人。换句话说,如果您在上次调用后的1秒之前一直向我请求答复,您将永远不会得到答复。是的是的。。。前进!说我粗鲁。


油门(10分钟):我是一台伐木机。每隔10分钟,我会将系统日志发送到后端服务器。

脱抖(10秒):嗨,我不是那台伐木机的堂兄。(并非每个脱伯爵节流阀在这个虚构的世界里)。我在附近的一家餐馆当服务员。我应该让你知道,只要你继续在订单中添加东西,我就不会去厨房执行你的订单。仅在10秒后上次修改订单后,我假设您已经完成订单。只有这样,我才能去厨房执行你的订单。


酷炫演示:https://css-tricks.com/debouncing-throttling-explained-examples网站/

服务员类比的学分:https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf

2
  • 1
    节气门不会自动延迟,但只有在必要时才会延迟。 评论 2021年7月29日16:54
  • 1
    解释得很好。一分钟后清除 评论 2022年9月13日11:26
63
  • 节流强制一个函数在一段时间内可以被调用的最大次数。如“最多每100毫秒执行一次此函数”
  • 辩论强制要求函数在经过一定时间后才被调用。如“仅当100毫秒过去而未被调用时才执行此函数。”

来源

0
41

它比演示要简单。

什么时候?节气门被调用时,它会定期(例如每20ms)启动您的函数,并在最后启动一次。

辩论只在比赛结束时(例如最后一场比赛后20毫秒)开火。

因此,只要事件继续快速触发(例如间隔不到20ms),去抖动将保持沉默,而油门将每隔20ms触发一次。两者都会在最后点火,不同的是油门也会在设定的间隔内点火。

例子:如果您正在滚动,则在滚动时节流阀将缓慢调用您的函数(每隔X毫秒)。Deboush将一直等到您完成滚动调用您的函数(可能只调用一次)。


我喜欢将油门视为“包括去抖动”,比赛结束后,他们都会做出最后决定,但由于实现细节的原因,这两个函数并不总是在同一时间进行最后一次调用,这使得演示很混乱。

1
  • 值得注意的是,在这些演示中,它们可能看起来“不一样”,因为去抖动总是在最后一个事件后X毫秒触发,而节流阀的最后一次调用可能会更早发生(并且在去抖动正常触发时不需要再次调用)。这很无关紧要,但如果你看一下演示,值得一提。
    – 泰勒
    评论 2019年3月29日16:19
32

用外行的话来说:

辩论将阻止函数运行虽然它仍然被频繁地调用。解抖功能将仅运行之后已经确定不再调用它,此时它将只运行一次。脱胶的实际示例:

  • 如果用户“停止键入”,则自动保存或验证文本字段的内容:在确定用户不再键入(不再按键)后,操作将只执行一次。

  • 记录用户放置鼠标的位置:用户不再移动鼠标,因此可以记录(最后)位置。

节流如果函数最近运行过,则无论调用频率如何,都会简单地阻止函数运行。节流的实际示例:

  • v-sync的实现基于节流:只有在上次屏幕绘制后经过16ms时,才会绘制屏幕。无论调用多少次屏幕刷新功能,它最多每16ms运行一次。
30

一幅画胜过千言万语

节气门节气门

辩论辩论

请注意辩论在事件流停止之前不会触发。然而,节气门将在每个间隔触发一个事件。

(感谢css技巧)

  • 1
    实时代码示例:codepen.io/dcorb/pen/KVxGqN 评论 2022年6月8日11:58
  • 9
    我无法想象,如果原始事件在节流和去抖动图像上都匹配,那么还有多少话值得说。。。。
    – 可可豆
    评论 2022年7月17日14:53
  • 1
    我们应该从照片中得到什么?它显示了不同的原始事件,因此我们无法比较函数的行为。。。 评论 3月9日15:24
28

一个现实生活中的类比,个人帮助我记住:

  • 谈话.你等对方说完后再回复。
  • 油门=鼓形钻头你只能在一个简单的4/4鼓位上弹奏音符。

使用案例消除颤抖:

  • 打字。你想在用户停止输入后做点什么。因此,在最后一次击键后等待1秒是有意义的。每次击键都会重新开始等待。
  • 动画。当用户停止悬停在某个元素上时,您希望缩小该元素。如果不使用去抖动,可能会由于光标无意中在“热”区和“冷”区之间移动而导致动画不稳定。

使用案例节气门:

  • 滚动。您希望对滚动作出反应,但限制计算量,因此每100毫秒执行一次操作就足以防止潜在的延迟。
  • 鼠标移动。与滚动相同,但用于鼠标移动。
  • API调用您希望对某些UI事件触发API调用,但希望限制API调用的数量,以避免服务器过载。
0
23

辩论允许您管理函数可以接收的调用频率。它组合了给定函数上发生的多个调用,以便忽略在特定持续时间到期之前发生的重复调用。基本上,去抖动可以确保为可能发生多次的事件发送恰好一个信号。

节流将函数接收的调用频率限制为固定的时间间隔。它用于确保目标函数的调用频率不超过指定的延迟。节流是指重复事件发生率的降低。

0
12

将去抖动和节流放在一起可能会非常混乱,因为它们都共享一个名为延迟.

在此处输入图像描述

辩论. The延迟就是等到没有人再召唤,然后再召唤。非常像关闭电梯门:门必须等到没有人试图进入才关闭。

节气门. The延迟就是等待一个频率,然后调用最后一个。就像开手枪一样,枪的射速不能超过一定的速度。


让我们看一下实现的细节。

功能去抖动(fn,延迟){let句柄=null返回函数(){if(手柄){handle=清除超时(handle)}句柄=设置超时(()=>{fn(…参数)},延迟)}}

反击,不断中断超时直到不再中断,然后触发fn公司.

功能节流阀(fn,延迟){let句柄=空let prevArgs=未定义返回函数(){prevArgs=参数if(!句柄){fn(…prevArgs)prevArgs=空句柄=setInterval(()=>{if(!prevArgs){handle=clearInterval(句柄)}其他{fn(…prevArgs)prevArgs=空}},延迟)}}}

节流,存储最后一个调用参数,并设置一个触发间隔,直到不再触发过去的参数。

相似之处他们都有延迟时间,在延迟期间没有火灾,尤其是只有一场火灾的情况下。两者都不聚合过去的事件,因此事件数可能与实际火灾数不同。

差异。在具有重复事件的去抖动情况下,延迟可以延长。而节气门壳体中的延迟是固定的。因此,一般来说,油门发出的火焰比去抖动的火焰更多。

易于记忆.辩论小组将通话捆绑成一组。Throttle将捆绑呼叫保持在特定频率内。

更新日期1-20-23

节流阀可能不需要设置间隔,这是我最近写的一个新版本也。

功能节流阀(fn,延迟){让canFire=true让队列=[]函数pop(){if(queue.length<1)返回const[that,args]=队列.pop()fn.apply(即args)canFire=错误设置超时(()=>{canFire=真pop()},延迟)}函数push(){queue.push([this,arguments])if(canFire)pop()} push.cancel=()=>{队列=[]}回推}

更新日期:11-09-23

我开始相信油门是在防反弹的基础上增加的。读一下这个https://windmaomao.media.com/throttle-is-a-debouse-add-on-80d4a6027ad4.

功能节流阀(fn,延迟){让h让队列=[]函数pop(){if(queue.length<1)返回如果(!h){const[that,args]=队列.pop()fn.apply(即args)h=设置超时(()=>{h=空pop()},延迟)}      }返回函数push(){queue.push([this,arguments])pop()} }
0
9

节流

Throttling强制执行函数的最大调用次数加班。如“最多每100次执行此功能毫秒。“说在正常情况下你会这么说在10秒内运行1000次。如果你只把它节流一次每100毫秒,它最多只能执行100个函数

(10s*1000)=10000ms10000ms/100ms节流=最多100次呼叫

取消公告

辩论强制要求函数在一段时间过去了,却没有被调用。如中所示“只有在100毫秒后才执行此函数被呼叫。"

也许一个函数在快速突发中被调用1000次,在3秒钟内被分散,然后停止被调用。如果你在100毫秒时解除了脉冲,那么一旦脉冲结束,该函数只会在3.1秒时触发一次。每次在脉冲期间调用该函数时,它都会重置去抖动计时器

来源:-节流和去抖

0
5

喉咙只是一个包装消除颤抖这使得消除颤抖呼叫已通过功能在一段时间内,如果消除颤抖将函数调用延迟到大于中指定的时间段喉咙.

5

假设我们有一个回调函数“cb”要在事件“E”上调用。让“E”在1秒内被触发1000次,因此将有1000次对“cb”的调用。这是1次呼叫/ms。要进行优化,我们可以使用:

  • 节流:节流为(100ms)时,“cb”为被调用【第100毫秒、第200毫秒、第300毫秒、……第1000毫秒】。这是每100毫秒1次呼叫。这里1000个对“cb”的调用优化为10个调用。
  • 辩论:在(100ms)的去抖动情况下,“cb”只会在[1100秒]调用一次。这是在[1000th ms]发生的“E”最后一次触发后100毫秒。这里1000个对“cb”的调用优化为1个调用。
4

洛达什图书馆推荐以下文章https://css-tricks.com/debouncing-throttling-explained-examples网站/其中详细解释了辩论节气门和它们的起源

4

辩论节流是从一系列事件中选择目标以达到减少目的的方法。它们都需要一段时间作为参数,例如:x个毫秒,和主要的/尾矿多样性来定义如何选择事件。

辩论

在下一个事件中没有其他事件发生时选择一个事件x个毫秒

“-->”:时间线“o,c,e”:事件,其中“o”是由“leading”选择的事件“e”是通过“尾随”选择的事件“c”是跳过的事件“|===|”:句点(x=5)
--oc-e-----occ-e----o-cc-ce-----o-c-cce----->源事件|===|    |===|    |===|        |===|||===|   ||===|   | |===|      | |===|   |  |===| | |===|  |  |===|     |   |===||      | |   |===||     |===|  |    |===||      | |       ||      |===| |     |===|--o---------o----------o-----------o---------->所选事件(前导)---------e----------e---------e-----------e-->所选事件(尾随)

节流

在中选择一个事件x个事件发生时为毫秒

--oc-e-----occ-e---o-ce--oe------o-c-eoe------>源事件|===|    |===|    |===| |===|  |===||===|--o--------o--------o-o---------o---------o-o------>所选事件(前导)------e---------e---------e-e-------e--------e-e---e-->所选事件(尾随)
2

辩论使函数只能在上次调用后的一定时间内执行

函数去抖动(func,wait){让超时return(…arg)=>{clearTimeout(超时);timeout=setTimeout(()=>函数应用(this,arg),等待)}}函数SayHello(){console.log(“耶稣在说你好!!”)}让x=放松(SayHello,3000)x()

这个节气门模式限制了一段时间内可以调用给定事件处理程序的最大次数。它允许以指定的间隔周期性地调用处理程序,忽略在此等待期结束之前发生的每个调用。

函数调节(回调、间隔){让enableCall=true;return(…args)=>{if(!enableCall)return;enableCall=false;回调.apply(this,args);setTimeout(()=>enableCall=true,interval);}}函数helloFromThrottle(){log(“耶稣在打招呼!!!”)}const foo=油门(helloFromThrottle,5000)foo()
1
  • 不要使用在里面回调.apply()或不返回箭头函数
    – 贝吉
    评论 2022年5月1日20:09
2

去抖动是如何在硬件中工作的。

消噪是从数字信号中去除噪声的过程。按下按钮时,信号来回跳动会导致按钮被注册为被多次按下。去抖动消除了这种噪音,因此按钮只被记录为按下一次。想象一下一把尺子在桌子边缘被弹跳,想象一下开关内的金属触点像这样弹跳。

更好的是,看看这个图表,它显示了由跳动引起的开关噪音。

我们使用正确计算额定值的电阻器和电容器使信号平滑n个毫秒。

解释信号节流在硬件中是如何工作的。

信号节流是限制信号注册次数的过程。这通常用于防止在短时间内多次按下按钮。

我更喜欢门控这个词,但那是因为我喜欢电子音乐制作。

我们在每个节流周期结束时打开闸门,让信号通过,然后在下一个节流周期再次关闭闸门。

解释去抖动在软件中是如何工作的。

软件中的辩论通常通过使用计时器来完成。按下按钮时,计时器启动。如果在计时器到期前再次按下按钮,计时器将重置。这样可以确保每个脱抖周期只能将按钮注册为按下一次。

在去抖动的许多实现中,我们创建了函数的去抖动版本,该版本嵌入到包含计时器(或门)的闭包中。当计时器延迟到期时,我们再次将其设置为空。实际函数仅在计时器为空时运行。通常,这意味着当我们第一次调用debounded函数时,它将运行一次,然后对它的后续调用将被有效地取消,直到延迟时间结束。

在一些去抖动实现中,当触发一系列调用且计时器未过期时,计时器将重新启动。仅在反弹停止后调用函数。这通常被称为尾随去抖。

解释节流在软件中的工作原理。

软件中的节流通常通过使用计数器来完成。按下按钮时,计数器递增。如果在计数器达到特定阈值之前再次按下按钮,计数器将重置。这限制了按钮在给定时间段内被注册为按下的次数。最好将其视为一个脉冲或节拍,当呼叫发送到油门时,它会打开和关闭一个门。

速率限制是考虑节流阀的另一种方式。

为什么这是一个常见的混淆原因?

在许多用例中,去抖动或调节将获得您想要的结果,特别是如果您使用的软件实现允许您链接、跟踪或引导您的调节/去抖动。

尽管如此,我还是希望这里的所有答案和这个答案能帮助你更清楚地理解。

他们非常相似。

2

在此处输入图像描述

Javascript中的去抖动和节流

这两个函数都有助于推迟或限制某些函数的执行速度。这反过来有助于优化我们的网络应用程序。

什么是节流?

  • 节流是我们在给定时间内触发函数的方式。
  • 第一个请求被允许通过。
  • 原始函数每指定时间只执行一次

例子:下图描述了以40ms的间隔/延迟触发的点击事件,事件e2、e3和e4发生在40ms内,因此没有执行。

在此处输入图像描述

节流代码,

const trottle=函数(fn,d){let标志=true;//通过第一项比赛返回函数(){if(标志){fn();//执行装饰功能flag=false;//阻止下一个激发的事件设置超时(()=>{标志=true;//在指定延迟后取消阻止下一个激发的事件},d);}};};

调节功能通常用于调整事件大小或滚动事件。

什么是去抖?

  • 辩论是一种阻止函数在最近被调用时被调用的方法。
  • 只允许通过最后一个请求。
  • 只有当调用方在指定的时间内停止调用修饰函数时,才会执行原始函数。

例子:下图描述了仅在延迟(100毫秒)完成后才触发的单击事件,

在此处输入图像描述

用户触发了事件e1、e2、e3和e4,但未成功执行,因为连续事件发生在100ms内。(e1和e2之间的延迟<100ms或e2和e3<100ms……等)事件e4成功调用了修饰函数,因为用户触发后有100ms的延迟。脱抖代码:

常数去抖=函数(fn,d){让计时器;返回函数(){clearTimeout(计时器);//如果事件被延迟触发,则清除/重置计时器timer=setTimeout(()=>{//执行函数fn();},d);};};

去抖动功能通常用于限制键入(输入字段)或单击事件。

行动中的辩论和节流:

在此处输入图像描述

降噪与节流你可以直观地看到这里的区别

支持文件:

https://www.geeksforeks.org/javascript-throttling/ https://www.geeksforeks.org/debouncing-in-javascript/

函数的节流和去抖差

https://www.youtube.com/watch?v=TBIEArmPywU

1

据我所知,简单来说节流-类似于在特定次数内调用setInterval(回调),即在事件发生时在一段时间内调用同一函数特定次数还有。。消抖-类似于调用setTImeout(callbackForApi)或在事件发生时经过特定时间后调用函数。此链接可能会有所帮助-https://css-tricks.com/the-difference-between节流和去抖动/

1

对于典型用例的例子,我推荐@Guy的答案。但对我来说,理解这两个概念的最好方法是把它做成披萨。🍕

比方说,你是一个很棒的比萨饼制造商,所以顾客在你的店里不断地要求更多的比萨。

节流:你决定在每小时结束时只放一个披萨,只要你在那一小时内至少收到一份披萨要求。

你在一个小时内收到100份披萨的请求,所以你会在那一小时结束时提供一份披萨。然后,你在接下来的一个小时里没有收到披萨的要求,所以你就不会拿出披萨了。接下来的一个小时,你会收到10份披萨的订单,所以你会在最后一个小时拿出一份披萨。

取消公告:你对顾客不断要求披萨感到恼火,所以你决定在他们停下来整整一分钟后才给他们披萨。

他们要求连续30分钟吃披萨,但一分钟后就不再要求了。这时,你会给他们一个披萨。

然后,他们要求连续5分钟吃披萨,之后一分钟就不再要求了。这时,你再给他们一块披萨。

1

这实际上是限制事件发生的方式。例如,如果您正在监听onclick事件,如果它是常规的,那么它会监听您的每次点击。

如果您使用Throttle,它将设置您想要侦听事件的时间间隔,例如每秒侦听一次单击。

辩论是一种更具限制性的辩论,它只会在一个事件的开始或结束时进行。例如,您正在滚动并使用Deboush,只有当您开始滚动并完成滚动时,它才会触发。

1

辩论:

如果函数未在该间隔内调用,则在该间隔后执行该函数。

节流阀:

以固定间隔执行函数n次。

1
  • 2
    您的回答可以通过其他支持信息得到改进。拜托编辑添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是否正确。你可以找到更多关于如何写出好答案的信息在帮助中心.
    – 社区 机器人程序
    评论 2021年10月15日0:34
1

两者之间的主要区别去抖动节流是指当用户在特定时间段内没有执行事件时,debuzz调用函数,而throttle在用户执行事件时以特定时间段的间隔调用函数。

0

这篇文章解释得很好,也有图表。

https://css-tricks.com/debouncing-throttling-explained-examples网站/

从文章中(以及一些澄清):

这个(节流)和去抖动之间的主要区别是节流保证了函数的定期执行,至少每X毫秒执行一次。

通常,去抖动在指定时间结束时调用函数,而节流在第一次调用节流函数时调用。有时去抖动可以使用额外的配置来改变这一点,从而在开始时进行调用。当使用特定配置调用时,一些deboush实现实际上可以完成throttle的功能(请参阅Lodash源代码)。

0

的简单概念节气门在表单中频繁单击提交按钮,我们需要使用节流阀。因此,submit函数可以防止频繁单击。它保存传递到函数中的相同请求。

关于消除颤抖,编写一个带有输入文本标记的简单代码,用于从服务器搜索一些数据。oninput,您可以使用debuzz,以便它删除以前的请求并将最后键入的单词传递给服务器

const throttle=(回调,时间=0)=>{设throttle_req,count=0;返回异步函数(){var上下文=此,args=参数;if(throttle_req)返回;throttle_req=真;如果(时间>0){callback.apply(上下文,参数);设置超时(()=>{throttle_req=假;},时间||200)}其他的{let response=等待callback.apply(context,args);throttle_req=假;返回响应;} }}常量去抖动=(回调,时间=0)=>{让债务_req;返回函数(){var上下文=此,args=参数;清除超时(debounce_req)debounce_req=设置超时(()=>{debounce_req=空;callback.apply(上下文,参数);},时间||200)}}

调用方式:只需将函数包装为节气门消除颤抖检查差异

节气门例如:同一按钮点击次数超过1次

var throttleFunct=油门(功能(num){console.log(num,“hello throttle”)}, 2000);throttleFunct(300)//它执行。因为这是第一次呼叫throttleFunct(400)//它不会执行

无时间的油门异步

var getDataAsync=节流阀(函数(id,name){return new Promise((resolve)=>{设置超时(()=>{解析({name:name,id:id})}, 2000)}) });异步函数测试(){let response=等待getDataAsync(120,'Sherrey')。然后(resp=>resp)log(响应,“response”)//它执行。因为这是第一个电话response=等待getDataAsync(120,'James')。然后(resp=>resp)console.log(response,“responsd2”)//它在第一次请求后执行2response=等待getDataAsync(120,'Jonathan').then(resp=>resp)log(response,“respond3”)//它在第二个请求后执行3}测试()

辩论例如:搜索框自动完成

var debounceFunct=debounce(函数(num){控制台.log(num+1)}, 2000);debounceFunct(300)//它不会执行并且被取消debounceFunct(400)//它执行并替换为前一个调用。因为这是最新的火灾事件
0

这里真正重要的是,用最简单的术语来说:如果你有一些动作,它会在一段时间内不断重复(例如鼠标移动或页面调整事件),你需要运行一些函数来响应,但你不想对每一个操作(因为它可能会损害性能),您有两个选项:

  • 去抖动-跳过所有传入动作,除了最后一个(“最后一个”是由您为去抖动功能设置的“等待”时间段定义的,例如,2s-它会认为操作洪水停止,如果在2s内没有采取任何操作,那么它会做出反应。如果您不关心定期更新,那么这个策略是合理的,您只需要至少做出一次反应。
  • 节流-如果你想“按计划”做出反应,即使动作泛滥无止境,也要定期更新,你可以让函数以固定的间隔运行(不再频繁,然后是指定的时间间隔),例如,2s节流意味着如果采取了动作,你的响应将执行一次,但不少于2秒。因此,随着连续动作的泛滥,你的响应将在0s、2s、4s、6s、8s上运行。。。

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.