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

У меня есть функция JavaScript, которая фактически завершает вызов на стороне сервера. Я хочу ограничить скорость, с которой эта функция может быть вызвана.

Что является простым способом, я могу ограничить, как быстро моя функция javascript будет вызвана, скажем, 200-500 миллисекунд или около того? Должен ли я использовать контроль таймера javascript?

Ответы

Ответ 1

Сначала вам нужно установить, хотите ли вы ограничить лимит, поскольку вы игнорируете все вызовы функций, которые выполняются в течение периода, когда вы ожидаете, или хотите просто запросить очереди в очереди, чтобы вы не делали больше, чем X запросов в секунду.

Если вы хотите использовать прежнее решение (не обращайте внимания на новые функциональные вызовы), вы должны посмотреть http://documentcloud.github.com/underscore/#throttle

Если вы хотите ограничить лимит, чтобы вы никогда не вызывали свою функцию более X раз в секунду, но не теряете эти вызовы функций, тогда вам нужно совершенно другое решение.

Я написал расширение подчёркивания https://gist.github.com/1084831 Вы можете увидеть рабочий пример в http://jsbin.com/upadif/8/edit#preview

Ответ 2

Это не позволит функции запускать, если прошло меньше 500 миллисекунд с момента последнего вызова.

(function(window, undefined){
    var canCall = true;
    window.funcName = function(){
        if (!canCall) 
            return;
        //Your function
        canCall = false;
        setTimeout(function(){
            canCall = true;
        }, 500);
    }
})(window);

Ответ 3

Вы можете создать флаг, который возникает при вызове функции и запуске таймера, и если этот флаг поднят, то вы не можете вызвать функцию, а затем через определенное время вызывается таймер и он отключает флаг, что позволяет снова вызвать функцию.

Флагом может быть что угодно, как bool или что-то в этом роде.

Ответ 7

Это зависит от того, какую функциональность вы хотите. Вот ссылка на страницу с двумя замечательными функциями: https://remysharp.com/2010/07/21/throttling-function-calls

throttle: обработать первый вызов, затем активировать следующие вызовы на основе порога (первый и последний вызов будут обработаны, но между ними будет только пара)

debounce: не обрабатывать вызовы до тех пор, пока функция не будет вызвана для задержки (только один вызов будет вызван после вызова и довольно продолжительный период)

Ответ 8

Если ваша проблема связана с созданием слишком большого количества работы, используйте очередь:

const work_queue = [];

function queue(message) {
  work_queue.push(message)  
}


function run() {
  const work = work_queue.shift();
  if (work !== undefined) {
    scan_one(work);
  }
}

setInterval(run, 15);

Если ваша проблема связана с функцией, вызываемой слишком часто:

let last = +new Date();

function run() {
  const now = +new Date();
  if (now - last > 5000) { // 5 seconds
    last = now;
    run_once();
  }
}



Ответ 9

fooCanBeCalled = true;
function foo(){
   if(!fooCanBeCalled) return;
   //Whatever you want to do
   fooCanBeCalled = false;
   setTimeout(function(){
      {
         fooCanBecalled = true;
      }
   , delayInMilliseconds);
}

Ответ 10

Вы можете использовать функцию debounce

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

var logging = debounce(function(){
    alert("Heavy task");
}, 5000);

setTimeout(logging, 100);//callback executed after 5 seconds

Дополнительная информация о том, как работает функция debounce http://qnimate.com/javascript-limit-function-call-rate/

Ответ 11

попробуйте setinterval ( "function()", 500)