2012-06-11 2 views
2

У меня есть функция. Он запускается из многих других функций скрипта. Иногда очень быстро и, возможно, почти одновременноПредотвращение слишком быстрого срабатывания функции

Как я могу предотвратить его слишком быстрое срабатывание в течение короткого времени? Установив задержку или таймер? Я хочу свести к минимуму вызовы базы данных, которые выполняет функция

Но не должно быть задержки в функции, если она не нужна .. Значение: Первый вызов = без задержки. Все остальные вызовы = только задержка, если предыдущий вызов был меньше, чем x секунд назад. А если задержка установлена ​​на, скажем, 5 секунд, функция должна ждать только 1 секунду, если предыдущий вызов был сделан 4 секунды назад .. Надеюсь, вы понимаете, что я имею в виду)

function checkusers() { 

    $.ajax({ 
     url: '/checkusers_in_db.php', 
     type: 'POST' 
    }); 

}; 
+0

Возможный дубликат [Как предотвратить чрезмерные вызовы функций в JQuery] (http://stackoverflow.com/questions/9861823/how-to-prevent-excessive-function-calls-in-jquery) –

+0

Вы можете использовать счетчик somwthing как var myCall = 0; затем myCall ++; внутри цикла функции, а затем продолжить по мере необходимости – swapnesh

+0

Будет ли вызов возвращать разные результаты каждый раз? То есть вы можете «кэшировать» результат на клиенте за X секунд? – avesse

ответ

0

Underscore.js имеет метод debounce, которые могли бы быть полезны

debounce_.debounce (функция, подождите, [немедленный]) Создает и возвращает новую версию противодребезговой защиты переданной функции, которая будет отложить его выполнение, пока не ждать миллисекунд прошла с тех пор в последний раз он был вызван. Полезно для реализации поведения, которое должно произойти только после того, как вход остановился. Например: рендеринг предварительного комментария Markdown, пересчет макета после того, как окно перестало изменяться, и так далее.

http://underscorejs.org/#debounce

Использование так:

checkusers_with_delay = _.debounce(checkusers, how_much_delay); 

, а затем использовать checkusers_with_delay во всех этих множеств других функций

+0

, это, конечно, требует, чтобы вы включили underscore.js на свою веб-страницу, но это отличная библиотека в любом случае – jakee

+0

При ближайшем рассмотрении , функция «throttle», которая задокументирована выше дебюта, еще лучше подходит для счета – jakee

0

Вы могли бы рассмотреть шаблон COMET (длинный опрос)

Контроллеры-рефакторы, поэтому он смотрит на ваш кеш пользователей, а не на звоните через AJAX. Поскольку отдельный фрагмент кода имеет вызов AJAX на странице PHP, который по возвращении обновляет ваш кеш пользователя.

Секрет в том, что PHP может «удерживать» запрос HTTP до тех пор, пока у него не будет достаточно данных для отправки на вашу страницу. Затем, после получения ответа, ваша страница делает еще один запрос AJAX, ополаскивает и повторяет.

-1

Это вызовет ajax, если он не запустился за последние 30 секунд.

var last_checkuser_time = new Date(); 

function checkusers() { 

    var now = new Date(); 
    var timeout = now.setSeconds(now.getSeconds() - 30); 
    if (last_checkuser_time < timeout) { 

     $.ajax({ 
      url: '/checkusers_in_db.php', 
      type: 'POST' 
     }); 
     last_checkuser_time = new Date(); 
    } 

}; 
+0

Будет ли эта очередь обращаться к функции или просто не запускаться, если последний вызов был менее 30 секунд назад? – mowgli

+0

Забудьте мой вопрос. Это выглядит хорошо. Попробуем позже;) – mowgli

+0

Но это также задержит первый звонок? – mowgli

0

Я построил свою собственную функцию изменения размера, что:

  • Предотвратить функцию от увольнения слишком быстро, используя this Пол ирландцами
  • Могут быть связаны со все селекторами (не только $ (окно)) с помощью this бушель Бен Alman

просто импортировать этот код:

/* 
* jQuery resize event - v1.1 - 3/14/2010 
* http://benalman.com/projects/jquery-resize-plugin/ 
* 
* Copyright (c) 2010 "Cowboy" Ben Alman 
* Dual licensed under the MIT and GPL licenses. 
* http://benalman.com/about/license/ 
*/ 
(function($,sr){ 

    // debouncing function from John Hann 
    // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ 
    var debounce = function (func, threshold, execAsap) { 
     var timeout; 

     return function debounced() { 
      var obj = this, args = arguments; 
      function delayed() { 
       if (!execAsap) 
        func.apply(obj, args); 
       timeout = null; 
      }; 

      if (timeout) 
       clearTimeout(timeout); 
      else if (execAsap) 
       func.apply(obj, args); 

      timeout = setTimeout(delayed, threshold || 500); 
     }; 
    } 
    // resize 
    jQuery.fn[sr] = function(fn){ return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); }; 

})(jQuery,'resize'); 

, а затем импортировать событие изменения размера Ben Alman().

Смежные вопросы