Javascript I';我想稍微改变一下lodash的行为';油门功能

Javascript I';我想稍微改变一下lodash的行为';油门功能,javascript,lodash,throttling,debounce,Javascript,Lodash,Throttling,Debounce,当前,如果将wait选项设置为500,则它最多每500毫秒触发一次底层函数 我想要的是,第一次呼叫时,它将等待100毫秒发射,但随后的呼叫只会每500毫秒发射一次。如果上次发射后超过500毫秒,它将在100毫秒后第一次返回发射 有没有简单的方法可以调整或组合一些油门和/或去盎司功能来创建这种流量?您可以保留一个日期,其中包含上次通话的预定时间: function throttle(fn, initial, cooldown) { let last = 0; return funct

当前,如果将
wait
选项设置为500,则它最多每500毫秒触发一次底层函数

我想要的是,第一次呼叫时,它将等待100毫秒发射,但随后的呼叫只会每500毫秒发射一次。如果上次发射后超过500毫秒,它将在100毫秒后第一次返回发射


有没有简单的方法可以调整或组合一些油门和/或去盎司功能来创建这种流量?

您可以保留一个日期,其中包含上次通话的预定时间:

 function throttle(fn, initial, cooldown) {
   let last = 0;
   return function throttled(...args) {
    setTimeout(fn, Math.max(0, cooldown + last - (last = Date.now())) || initial, ...args);
   }
 }

@乔纳斯·威尔姆斯,谢谢你的回答。我真的不喜欢使用
Date
,我发现编写节流函数实际上非常简单。一开始我不知道,因为lodash的节流函数是基于它们的去盎司函数,而它们的去盎司函数在我看来有点复杂

不管怎样,我最终编写了这个函数,它似乎完成了任务

输出功能节气门(fn,…延迟){
设t1,t2,activeDelay=0
返回函数(){
if(t2){
清除超时(t2)
t2=未定义
}
if(t1){
返回
}
t1=设置超时(()=>{
fn(…参数)
t1=未定义
//每次增加有效延迟
//然后坚持最后一个。
activeDelay=Math.min(++activeDelay,delays.length-1)
//设置第二个“超时”,以重置
//主动延迟返回到第一个。
t2=设置超时(()=>{
activeDelay=0
t2=未定义
},延迟[activeDelay])
},延迟[activeDelay])
}
}