Underscore提供方法,限制。来自他们的文档:
创建并返回传递函数的新的受限制版本,当重复调用时,每隔等待毫秒最多只调用一次原始函数。对于速度限制事件非常有用,这些事件的发生速度比您能跟上的速度要快。
现在想象一下自动填充表单的情况。这意味着如果在100毫秒的窗口中键入“abc”,则只会搜索“a”,而不是“bc”。
这是对underscore.js的严重疏忽吗?你会建议什么是一个干净的解决方案?
答案 0 :(得分:4)
var test = _.debounce(function() { console.log('foo'); }, 3000);
然后,如果您多次致电test()
,您会发现只有在最后调用后的三秒钟之后,该功能才会被调用。
这是完全我们都在寻找...并且没有注意到正好在文档的throttle
下方。
答案 1 :(得分:3)
对于此用例,您可能希望使用以下“缓冲区”功能,该功能仅应用等待窗口中的最后一次调用。
https://gist.github.com/2484196
_.buffer = function(func, wait, scope) {
var timer = null;
return function() {
if(timer) clearTimeout(timer);
var args = arguments;
timer = setTimeout(function() {
timer = null;
func.apply(scope, args);
}, wait);
};
};
答案 2 :(得分:1)
我保留idle
function来处理这种类型的用户互动。这个想法是要求定期调用某些函数(即,当在输入中按下某个键时);一旦间隔通过而没有调用所述函数,就会触发单独的回调。这可能不是您想要自动完成的行为(您可能希望在用户的输入暂停之前开始搜索),但这是我过去使用过的一种方法。
如果有人有更好的解决方案,我会全力以赴!
答案 3 :(得分:0)
是的,你是对的,它对自动填充表格不起作用。不过,我认为它适用于其他类型的东西。给出的示例是处理滚动事件。
答案 4 :(得分:0)
看起来其他答案提到使用去抖动而不是油门。我找到了一个解决方案,可以让您保持节流行为(保持函数调用通过),同时仍确保最后一次调用。
https://gist.github.com/ayushv512/a2f963bface38f5e2f6f6bba39bba9b9#file-throttle-js
const throttle = (func, limit) => {
let lastFunc;
let lastRan;
return function() {
const context = this;
const args = arguments;
if (!lastRan) {
func.apply(context, args)
lastRan = Date.now();
} else {
clearTimeout(lastFunc);
lastFunc = setTimeout(function() {
if ((Date.now() - lastRan) >= limit) {
func.apply(context, args);
lastRan = Date.now();
}
}, limit - (Date.now() - lastRan));
}
}
}