强调油门+确保最后一次通话

时间:2012-03-08 04:55:14

标签: javascript ajax timeout throttling underscore.js

Underscore提供方法,限制。来自他们的文档:

创建并返回传递函数的新的受限制版本,当重复调用时,每隔等待毫秒最多只调用一次原始函数。对于速度限制事件非常有用,这些事件的发生速度比您能跟上的速度要快。

现在想象一下自动填充表单的情况。这意味着如果在100毫秒的窗口中键入“abc”,则只会搜索“a”,而不是“bc”。

这是对underscore.js的严重疏忽吗?你会建议什么是一个干净的解决方案?

5 个答案:

答案 0 :(得分:4)

啊,我没看过正确的文档! 的功能。

var test = _.debounce(function() { console.log('foo'); }, 3000);

然后,如果您多次致电test(),您会发现只有在最后调用后的三秒钟之后,该功能才会被调用。

这是完全我们都在寻找...并且没有注意到正好在文档的throttle下方。

Underscore docsLo-Dash docswhat is LoDash?

答案 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));
    }
  }
}