【问题标题】:How implement debounce for event listener ? Problem with storage event如何为事件监听器实现去抖动?存储事件问题
【发布时间】:2021-03-10 02:52:24
【问题描述】:

我有去抖功能

function debounce(func, wait, immediate) {
  // 'private' variable for instance
  // The returned function will be able to reference this due to closure.
  // Each call to the returned function will share this common timer.
  var timeout;

  // Calling debounce returns a new anonymous function
  return function() {
    // reference the context and args for the setTimeout function
    var context = this,
      args = arguments;

    // Should the function be called now? If immediate is true
    //   and not already in a timeout then the answer is: Yes
    var callNow = immediate && !timeout;

    // This is the basic debounce behaviour where you can call this 
    //   function several times, but it will only execute once 
    //   [before or after imposing a delay]. 
    //   Each time the returned function is called, the timer starts over.
    clearTimeout(timeout);

    // Set the new timeout
    timeout = setTimeout(function() {

      // Inside the timeout function, clear the timeout variable
      // which will let the next execution run when in 'immediate' mode
      timeout = null;

      // Check if the function already ran with the immediate flag
      if (!immediate) {
        // Call the original function with apply
        // apply lets you define the 'this' object as well as the arguments 
        //    (both captured before setTimeout)
        func.apply(context, args);
      }
    }, wait);

    // Immediate mode and no wait timer? Execute the function..
    if (callNow) func.apply(context, args);
  }
}

还有一些功能,例如:

const storageEventCb = () => console.error(1); 

// Define the debounced function
var debouncedCb = debounce(storageEventCb, 1500);
debouncedCb(); // run
debouncedCb(); // ignore 
debouncedCb(); // ignore

感觉不错,但是当我 lisnener 事件存储时

window.addEventListener('storage', storageEventCb );

我得到了很多调用函数。如何解决?

【问题讨论】:

  • 你没有定义storageEventCb2
  • 能否请您提供执行此行的代码window.addEventListener('storage', debouncedCb);
  • 我更新了代码,问题在那里
  • 嗯,你在做window.addEventListener('storage', storageEventCb); 而不是window.addEventListener('storage', debouncedCb);

标签: javascript


【解决方案1】:

只需将 debounced 函数设置为事件监听器?

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

const storageEventCb = () => console.error(1); 

// Define the debounced function
const debouncedCb = debounce(storageEventCb, 1500);

window.addEventListener('storage', debouncedCb);

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2021-03-07
    • 2016-08-26
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2012-07-08
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多