throttle节流函数第一种写法为什么是错的,不能运行。第二种写法我觉得有点奇怪,onInput方法根本就不是一个函数,直接调用throttle了,为什么不在外面包一个function()
1.第一种
_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, 所以没问题。
第一个的报错信息可以看一下吗
不知道你这个问题是否已经解决, 如果还没有解决的话:对于第一个问题,无法确定具体是哪里出了问题,需要看一下相关的代码,建议在问题描述中提供更多相关的信息。
对于第二个问题,可能的原因是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);
}
};
}