[英]How to implement a throttle-like function but without loosing time between calls
[英]Can I throttle a function without dropping function calls in JS?
我需要一个函数在一个函数调用和另一个函数调用之间有一定的时间,这与油门的作用非常相似,但我需要参与所有的函数调用。
让我解释:
假设我们对函数foo
和一个调用 foobar 的事件有 10 秒的限制。 该事件被触发 3 次,每 5 秒触发一次。 只有第一个和最后一个会被参加,而中间的将被忽略。
普通油门:
[event]--5s--[event]--5s--[event]
[foo]---------10s---------[foo]
我需要的是始终监听事件,但在前一个事件之后 10 秒。
[event]--5s--[event]--5s--[event]
[foo]----------10s--------[foo]---------10s--------[foo]
有任何想法吗? 我想过油门和去抖动器,但没有一个适合我需要做的。
这很简单。 只需创建一组函数对象,然后每 10 秒拉出最旧的一个并执行它。
const queue = [] function rateLimit(fn) { queue.push(fn) } setInterval(() => { const nextFn = queue.shift() // remove the first function, and return it. if (nextFn) nextFn() // execute the first function if it exists. }, 1000) // Your interval in milliseconds. Set to 1s for testing. rateLimit(() => console.log('A')) rateLimit(() => console.log('B')) rateLimit(() => console.log('C'))
您可以添加一些逻辑来在队列为空时清除间隔,并在新项目进入时重新启动它,以便第一次调用总是在没有等待时立即发生。 但我留给你一个练习。
如果有人感兴趣,我使用了Alex Wayne的答案并添加了一些逻辑来更好地控制他提到的间隔。
const queue = [] var intervalExecution function rateLimit(fn) { queue.push(fn) if (queue.length && !intervalExecution) { intervalExecution = setInterval(() => { const nextFn = queue.shift() if (nextFn) { nextFn() } else { clearInterval(intervalExecution) intervalExecution = undefined } }, 1000) } } rateLimit(() => console.log('test')) rateLimit(() => console.log('test')) rateLimit(() => console.log('test')) rateLimit(() => console.log('test'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.