javascript - 正确理解 javascript 中的 throttle

标签 javascript closures throttling

嗨,我正在尝试理解 javascript 中的 throttle 。 我有这个代码

function runOnce(fn, ms) {
  if(typeOf(fn) !== "function")
    return;
  ms = ms || 5000;
  var active;        
  return (function() {    	
         	if(active) {     
              console.log('no hurry please');      
            } else {
              active = setTimeout(fn, ms);      
            }
          })();      
};

我想使用两个不同的函数回调进行测试

function x() {
   console.log('timeout from x');
}
function y() {
    console.log('timeout from y');
}

现在这是我的问题: 多次调用 runOnce(x);runOnce(x);runOnce(x); ,throttle 函数似乎没问题(仅调用 function x 一次)

  1. 但是为什么 “console.log('请不要着急');”永远不会被调用?

当我调用runOnce(x);runOnce(x);runOnce(y);runOnce(y);时,函数x函数y 只被调用 1 次,这很好。

  • 但是为什么如果我调用runOnce(x);runOnce(y);runOnce(x);runOnce(y);函数x函数 y 被调用了 2 次?
  • 谢谢

    最佳答案

    问题出在我的 runOnce 代码中。 如果我将 var active 移到函数之外,问题就解决了(感谢@Andreas 提供的链接)。并稍微修复一下功能。完整代码如下:

    var active, fnArray = [];
    
    function runOnce(fn, ms) {
      if (typeof(fn) !== "function")
        return;
      ms = ms || 5000;
      return (function() {
        if (active && fnArray.indexOf(fn.name) >= 0) {
          console.log('no hurry please');
        } else {
          fnArray.push(fn.name);
          active = setTimeout(function() {
            fnArray = fnArray.filter(function(elm) {
              elm !== fn.name
            });
            fn();
          }, ms);
        }
      })();
    };
    
    function x() {
      document.body.innerHTML += 'timeout from x </br>';
    }
    
    function y() {
      document.body.innerHTML += 'timeout from y </br>';
    }
    runOnce(x);
    runOnce(x);
    runOnce(x);
    runOnce(y);
    runOnce(x);
    runOnce(y);

    关于javascript - 正确理解 javascript 中的 throttle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40486867/

    相关文章:

    php - 有没有办法在 PHP 匿名函数中不捕获 $this?

    groovy - 从 Groovy 中的字符串加载闭包代码

    python - 测试 Django throttle

    mysql - 在 Mule 中限制 Mule 消息

    performance - 有没有办法限制或限制 Oracle 中用户使用的资源?

    javascript - 我已经实现了飞行模式的 map 路由,但无法在其上绘制标记?

    javascript - 组织 jQuery/JavaScript 代码的最佳方式 (2013)

    javascript - 在 javascript 中将 HTML 元素 append 到当前元素

    javascript - 如何将 CSS 效果转换为 Javascript/jQuery

    javascript - “Private” Javascript 中的属性继承