这可能是一个简单的错误。我正在尝试实现一个节流阀功能(归功于我们的man webdevsimplified的高质量内容:https://blog.webdevsimplified.com/2022-03/debounce-vs-throttle/)的数据。
我的油门实现不起作用,我不知道为什么。我如何才能让油门工作?
<body>
<script>
function printHi() {
console.log("Hi");
}
function throttle(cb, delay = 1000) {
let shouldWait = false
let waitingArgs
const timeoutFunc = () => {
if (waitingArgs == null) {
shouldWait = false
} else {
cb(...waitingArgs)
waitingArgs = null
setTimeout(timeoutFunc, delay)
}
}
return (...args) => {
console.log("should wait?", shouldWait);
if (shouldWait) {
// It never goes in here...?
waitingArgs = args
return
}
cb(...args)
shouldWait = true
setTimeout(timeoutFunc, delay)
}
}
</script>
<button onclick="(function () {
throttle(printHi)();
})()">Click me</button>
</body>
连续单击按钮将打印到控制台:
should wait? false
Hi
should wait? false
Hi
should wait? false
Hi
shouldWait
永远不会打印true
,即使它应该...
1条答案
按热度按时间oug3syen1#
您最初的实现不起作用,因为
shouldWait
和waitingArgs
的作用域是函数,所以每次函数运行都有一组新的shouldWait = false
变量。由于
var
和let
之间的作用域不同,您可能会犯这个错误,如果以这种方式使用,前者的作用域是全局的。下面是我的解决方案,它只是将2个变量移出函数。
第一个