throttle节流函数遇到了问题,求解答一下

throttle节流函数第一种写法为什么是错的,不能运行。第二种写法我觉得有点奇怪,onInput方法根本就不是一个函数,直接调用throttle了,为什么不在外面包一个function()
1.第一种

img


2.第二种

img

_lodash.throttle(...)只是返回了一个函数,并不会直接调用这个函数,第一种写法的错误在于onInput函数内部只是定义了一个函数,并没有调用这个函数,第一种写法相当于如下代码。

methods: {
    onInput(e){
          let fn = _lodash.throttle(() = > this.$set(this.value, "input", e.value), 1000) ; // 在onInput函数内部只是得到了一个函数,而没有调用这个函数,所以onInput函数被调用的时候,并不会产生任何效果。
    } 
}
// 所以如果要使用第一种写法,应该把得到的函数调用一下,如下
methods: {
    onInput(e){
         _lodash.throttle(() = > {
                    this.$set(this.value, "input", e.value)
          }, 1000)() ; // 在最后添加上()进行调用。 
    } 
}

第二种写法正是把_lodash.throttle()返回的函数赋值给了onInput函数,使得onInput函数本身就是上面代码中的fn, 所以没问题。

第一个的报错信息可以看一下吗

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    对于第一个问题,无法确定具体是哪里出了问题,需要看一下相关的代码,建议在问题描述中提供更多相关的信息。

    对于第二个问题,可能的原因是onInput方法已经被绑定到了一个事件监听器中,所以直接传入throttle函数即可。这是因为throttle函数接受一个函数作为参数,并返回一个新的函数,所以传入onInput方法就可以实现节流功能了。

    以下是相关示例代码:

    // 第一种写法,无法运行,原因不明
    function onInput() {
      //...
    }
    const throttleFunc = throttle(onInput, 500);
    // ...
    
    // 第二种写法,直接传入onInput方法即可
    input.addEventListener('input', throttle(onInput, 500));
    // ...
    

    其中throttle函数的实现可以参考lodash等库中的源码实现,也可以自己实现一个,以下是一个简单的示例实现,供参考:

    function throttle(fn, wait = 1000) {
      let timeoutId;
      let called = false;
    
      return function(...args) {
        if (!called) {
          called = true;
          fn.apply(this, args);
          setTimeout(() => called = false, wait);
        } else if (!timeoutId) {
          // 后续的事件调用会被合并到最后一个调用中
          timeoutId = setTimeout(() => {
            fn.apply(this, args);
            timeoutId = null;
          }, wait);
        }
      };
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^