任何人都可以用简单的词语解释一下为限制速率而对函数进行节流和反跳之间的区别。
在我看来,两者似乎都做同样的事情。我检查了这两个博客以了解:
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
任何人都可以用简单的词语解释一下为限制速率而对函数进行节流和反跳之间的区别。
在我看来,两者似乎都做同样的事情。我检查了这两个博客以了解:
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
Answers:
简单来说:
您可以在这里直观地看到差异
如果您有一个被调用很多的函数-例如,当发生调整大小或鼠标移动事件时,可以多次调用它。如果您不希望这种行为,可以对其进行节流,以便定期调用该函数。防弹跳意味着在一系列事件的结尾(或开始)调用它。
就个人而言,我发现防抖比节流阀更难理解。
由于这两个功能都可以帮助您推迟执行并降低执行速度。假设您反复调用油门/反跳返回的修饰函数...
我发现防抖的最后一部分对于理解其要实现的目标至关重要。我还发现_.debounce的旧版本实现有助于理解(由https://davidwalsh.name/function-debounce提供)。
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
一个牵强的比喻,但也许也有帮助。
您有一个名为Chatty的朋友,喜欢通过IM与您交谈。假设她说话时,她每5秒钟发送一条新消息,而您的IM应用程序图标则在上下跳动时,您可以...
差异性
+--------------+-------------------+-------------------+
| | Throttle 1 sec | Debounce 1 sec |
+--------------+-------------------+-------------------+
| Delay | no delay | 1 sec delay |
| | | |
| Emits new if | last was emitted | there is no input |
| | before 1 sec | in last 1 sec |
+--------------+-------------------+-------------------+
用例说明:
搜索栏-是否不想在用户每次按键时进行搜索?想要在用户停止键入1秒钟时进行搜索。使用debounce
上的按键1秒。
射击游戏-手枪每次射击之间需要1秒钟的时间,但是用户多次单击鼠标。throttle
在鼠标单击时使用。
颠倒他们的角色:
在搜索栏上节流1秒钟 -如果用户键入abcdefghij
中的每个字符,则该键为0.6 sec
。然后,油门将在第一次a
按下时触发。在接下来的1秒钟内它将忽略每次按下,即b
在0.6秒钟处将被忽略。然后c
在1.2秒将再次触发,这将重新设置时间。因此d
将被忽略并被e
触发。
弹跳手枪1秒钟-当用户看到敌人时,他单击鼠标,但不会射击。他将在该秒内再次单击几次,但不会射击。他会查看它是否仍有子弹,这时(最后一次单击后1秒钟)手枪会自动射击。
油门(1秒):您好,我是机器人。只要您一直对我执行ping操作,我就会一直与您交谈,但每次恰好在1秒钟之后。如果您在不到一秒钟的时间内向我ping回复,我仍然会每隔1秒回复一次。换句话说,我只想按固定的间隔回复。
防反跳(1秒):嗨,我是那个^^机器人的表亲。只要您一直对我执行ping操作,我将保持沉默,因为自从您上次ping我以来,我只在经过1秒后才回复。我不知道是因为我的态度问题还是因为我不想打扰别人。换句话说,如果自上次调用以来一直在1秒钟之前要求我答复,那么您将永远不会得到答复。是的...继续前进!叫我粗鲁。
油门(10分钟):我是伐木机。定期间隔10分钟后,我会将系统日志发送到我们的后端服务器。
防抖动(10秒):嗨,我不是那台伐木机的堂兄。(在这个虚构的世界中,并非每个防抖器都与节流阀有关)。我在附近的一家餐馆当服务生。我应该告诉您,只要您继续向订单中添加商品,我就不会去厨房执行订单。上次修改订单后仅经过10秒钟,我将假定您已完成订单。只有这样,我才能在厨房执行您的订单。
酷演示:https://css-tricks.com/debouncing-throttling-explained-examples/
服务员类比的功劳:https : //codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
这很简单。
它们执行完全相同的操作(速率限制),只是在调用节流阀时会定期触发您的包装函数,而反跳不会。反跳只是(尝试)在最后一次调用您的函数。
示例:如果您正在滚动,那么节流将在您滚动时(每X毫秒)缓慢调用您的函数。防弹跳将一直等到滚动完成之后再调用函数。
一个现实的类比,可以帮助我记住:
防抖用例:
节流的用例:
throtle只是周围的包装去抖,这使得去抖调用通过function
在一段时间内,如果去抖动延迟上的时间,这是更大然后在指定时间内的函数调用throtle。
lodash库建议使用以下文章https://css-tricks.com/debouncing-throttling-explained-examples/,其中详细说明了Debounce
和的区别Throttle
及其来源
节流
节流强制执行一个函数超时的最大次数。如“每100毫秒最多执行一次此功能”中所述。假设在正常情况下,您将在10秒内调用此函数1,000次。如果将其每100毫秒调节一次,则该函数最多只能执行100次
(10s * 1,000) = 10,000ms
10,000ms / 100ms throttling = 100 maximum calls
防弹跳
防反跳强制在不经过一定时间的情况下才再次调用该函数。就像“仅在经过100毫秒而不调用它时才执行此函数”中一样。
也许一个函数被快速调用了1,000次,分散了3秒钟,然后停止调用。如果您在100毫秒处将其反跳,则一旦爆发结束,该功能将仅在3.1秒时触发一次。每次在猝发过程中调用该函数时,都会重置去抖计时器
来源:- 油门和反跳