JavaScript 35; throttle can´;你不会连续三次接到电话吗?

JavaScript 35; throttle can´;你不会连续三次接到电话吗?,javascript,lodash,Javascript,Lodash,因此,我在Javascript中使用.throttle方法,以避免滥发函数。即使经常调用该方法,这些调用之间也会有一段时间。这是我的密码: const _ = require('lodash'); const minTimeBetweenAlerts = 2000; const tester = _.throttle(test, minTimeBetweenAlerts); function test() { console.log('function called!'); } fo

因此,我在Javascript中使用.throttle方法,以避免滥发函数。即使经常调用该方法,这些调用之间也会有一段时间。这是我的密码:

const _ = require('lodash');
const minTimeBetweenAlerts = 2000;

const tester = _.throttle(test, minTimeBetweenAlerts);

function test() {
   console.log('function called!');
}

for(var i = 0; i < 3; i++) {
   tester();
}
const=require('lodash');
const minTimeBetweenAlerts=2000;
常数测试仪=节气门(测试,两个节气门之间的最小时间);
功能测试(){
log('function called!');
}
对于(变量i=0;i<3;i++){
测试器();
}
正如您所看到的,这是一个非常简单的代码。但我注意到,如果tester();将被调用超过2次(例如在非常短的时间内连续调用3次)。问题是:在运行我的代码之后,我的控制台中的输出只有2次“函数调用”。有人建议我如何解决这个问题吗

编辑:我的目标是,函数将被调用3次而不是2次。但是我想保持函数调用之间的minTime的行为是调用函数,然后默认情况下,如果在间隔内进行了后续调用,则在间隔的末尾(后缘)再次调用它。这就是为什么会有两次调用

在下图中,“call”表示调用节流函数,“invoke”表示运行底层函数。请注意其中一个呼叫是如何被丢弃的:

0              1000ms           2000ms   
|______________|______________|

^        ^      ^             ^
|        |      |             |
invoke   |      |             invoke (trailing invocation)
|        |      |
|        |      |
call     call   call

您需要的是一个速率限制器功能。我尝试过下面的一个,但我建议使用库实现

功能限制(f,间隔){
常数q=[]
设timeLastRun=0
让currentTimeoutId=null
康斯特·梅伯伦=()=>{
如果(!q.length)返回;
const now=performance.now()
如果((现在-timeLastRun)>=间隔){
clearTimeout(currentTimeoutId)
currentTimeoutId=null
timeLastRun=现在
q、 pop()()
if(q.长度){
currentTimeoutId=setTimeout(maybeRun,间隔)
}
}
}
const limited=(…args)=>{
q、 取消移位(()=>f(…参数))
梅伯伦()
if(q.length&!currentTimeoutId){
currentTimeoutId=setTimeout(maybeRun,间隔)
}
}
返回有限公司
}
功能测试(){
log('调用函数!')
}
常数测试仪=极限(测试,2000)
对于(变量i=0;i<3;i++)
tester()
的行为是调用函数,然后默认情况下,如果在间隔内进行了后续调用,则在间隔的末尾(后缘)再次调用该函数。这就是为什么会有两次调用

在下图中,“call”表示调用节流函数,“invoke”表示运行底层函数。请注意其中一个呼叫是如何被丢弃的:

0              1000ms           2000ms   
|______________|______________|

^        ^      ^             ^
|        |      |             |
invoke   |      |             invoke (trailing invocation)
|        |      |
|        |      |
call     call   call

您需要的是一个速率限制器功能。我尝试过下面的一个,但我建议使用库实现

功能限制(f,间隔){
常数q=[]
设timeLastRun=0
让currentTimeoutId=null
康斯特·梅伯伦=()=>{
如果(!q.length)返回;
const now=performance.now()
如果((现在-timeLastRun)>=间隔){
clearTimeout(currentTimeoutId)
currentTimeoutId=null
timeLastRun=现在
q、 pop()()
if(q.长度){
currentTimeoutId=setTimeout(maybeRun,间隔)
}
}
}
const limited=(…args)=>{
q、 取消移位(()=>f(…参数))
梅伯伦()
if(q.length&!currentTimeoutId){
currentTimeoutId=setTimeout(maybeRun,间隔)
}
}
返回有限公司
}
功能测试(){
log('调用函数!')
}
常数测试仪=极限(测试,2000)
对于(变量i=0;i<3;i++)

tester()
如何调用tester?一个for循环,它调用tester()3次;你们可以分享一下吗?我编辑了我的代码,在那个里你们可以看到你们是如何调用tester的?一个for循环,它调用了3次tester();你可以分享一下吗?我编辑了我的代码,你可以看到