2017-01-19 9 views
0

Код ниже имитирует выполнение живого поиска (заменяется выходом консоли) с помощью debounce function.Отказ от прямого поиска в javascript не выполняется закрытие

Вызывается функция debounce, но переданная функция liveSearch не является. Я предполагаю, потому что debounce возвращает функцию, которая не выполняется.

Как я могу позвонить liveSearch таким образом, что он фактически отлучен?

var MySearch = (function($) { 
    var $search = $('.search'), 
     searchDelay = 500, 
     keysToIgnore = [8, 16, 17, 18, 27, 32, 37, 38, 39, 40, 91, 191, 220]; // space, esc, bkspc, ctrl, alt, cmd, arrows, /\ 

    function init() { 
     $search.on('keyup', function(e) { 
      if (keysToIgnore.indexOf(e.keyCode) == -1) { 
       // FIXME: this isn't actually executing the passed liveSearch fn 
       debounce(liveSearch, searchDelay); 

       // This executes liveSearch, but doesnt debounce 
       // debounce(liveSearch, searchDelay)(); 
      } 
     }); 
    } 

    function liveSearch() { 
     console.log("searching:", $search.val()); 
    } 

    // Remy's debounce func: 
    // https://remysharp.com/2010/07/21/throttling-function-calls 
    function debounce(fn, delay) { 
     console.log("debouncing for", delay); 

     var timer = null; 

     return function() { 
      var context = this, 
       args = arguments; 

      clearTimeout(timer); 

      timer = setTimeout(function() { 
      fn.apply(context, args); 
      }, delay); 
     }; 
    } 

    return { 
     init: init 
    }; 
}(jQuery)); 

jQuery(function() { 
    MySearch.init(); 
}); 

http://codepen.io/bbodien/pen/BpWBXm?editors=0010

+0

[Другой метод дребезга] (https://github.com/JDMcKinstry/debounce) – SpYk3HH

ответ

1

Каждый вызов debounce создает свое собственное закрытие с timer переменной. Следовательно, функция debounce предназначена для вызывается один раз и возвращает функцию, которая должна вызываться вместо liveSearch:

function init() { 
    var debouncedLiveSearch = debounce(liveSearch, searchDelay); 

    $search.on('keyup', function(e) { 
     if (keysToIgnore.indexOf(e.keyCode) == -1) { 
     debouncedLiveSearch(); 
     } 
    }); 
    }