Javascript节流实作未延迟

nfg76nw0  于 2022-11-20  发布在  Java
关注(0)|答案(1)|浏览(147)

这可能是一个简单的错误。我正在尝试实现一个节流阀功能(归功于我们的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,即使它应该...

oug3syen

oug3syen1#

您最初的实现不起作用,因为shouldWaitwaitingArgs的作用域是函数,所以每次函数运行都有一组新的shouldWait = false变量。
由于varlet之间的作用域不同,您可能会犯这个错误,如果以这种方式使用,前者的作用域是全局的。
下面是我的解决方案,它只是将2个变量移出函数。
第一个

相关问题