Underscore.js: _.throttle(функция, ожидание)

В соответствии с документация подчеркивания:

throttle_.throttle(функция, подождите)
Создает и возвращает новый, дроссельная версия переданной функции, которая при вызове неоднократно, на самом деле вызовет только оригинальную функцию не более одного раза за каждые миллисекунды ожидания. Полезно для событий ограничения скорости, которые происходят быстрее, чем вы можете не отставать.

Что это значит Useful for rate-limiting events that occur faster than you can keep up with.
Эта функция эквивалентна setTimeout с функцией, которая вызывает себя?
Может ли кто-нибудь предоставить мне пример на jsfiddle?

Ответ 1

это не просто setTimeout() Попробуйте это

var a = _.throttle(function(){console.log('called')}, 1000);
while(true) {
  a();
}

он будет вызываться один раз в секунду, а не раз каждую итерацию. В родной JS это будет выглядеть так:

var i = null;
function throttle(func, delay){
  if (i) {
      window.clearTimeout(i);
  }
  i = window.setTimeout(func, delay)
}

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

Ответ 2

Чтобы продлить ответ Darhazer

Это больше похоже, за исключением того, что _.throttle называется неминуемо, а затем снова после delay миллисекунд

function throttle(func, delay) {
    var timer = 0;

    return function() {
        var context = this,
            args = [].slice.call(arguments);

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

Ответ 3

Я нашел этот отличный jsfiddle, который помог мне:

jsfiddle.net/max23_/2wn5ybdg/1 (обновлено @max23_)

В моем случае мне понадобился газ, потому что функция (которая была запросом к серверу) вызывалась около 500 раз в 1 секунду и перегружала сервер. Поэтому я изменил его так, чтобы функцию можно было вызывать max только раз в 3 секунды. Так что не имеет значения, сколько раз он звонил, это будет происходить только раз в 3 секунды.

Что-то вроде этого:

var informationFromServer;
var a = _.throttle(function(){
    informationFromServer = serverCallFunction();
}, 3000);

function getsCalledALot()
{
    a();
}

function serverCallFunction()
{
    var data = $.post....
    return data;
}

Ответ 4

Здесь описывается разница между дросселем и debounce: https://css-tricks.com/the-difference-between-throttling-and-debouncing/

/*
"Debouncing enforces that a function not be called again until a certain amount of time has passed without it being called. As in "execute this function only if 100 milliseconds have passed without it being called."
"Perhaps a function is called 1,000 times in a quick burst, dispersed over 3 seconds, then stops being called. If you have debounced it at 100 milliseconds, the function will only fire once, at 3.1 seconds, once the burst is over. Each time the function is called during the burst it resets the debouncing timer."
*/
_.debounce = (fn, delay) => {
  let timer
  return (...args) => {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(null, args)
    }, delay)
  }
}
/*
"Throttling enforces a maximum number of times a function can be called over time. As in "execute this function at most once every 100 milliseconds."
 */
_.throttle = (fn, delay) => {
  let canCall = true
  return (...args) => {
    if (canCall) {
      fn.apply(null, args)
      canCall = false
      setTimeout(() => {
        canCall = true
      }, delay)
    }
  }
}

Ответ 5

_. throttle используется для предотвращения частых вызовов метода для конкретного изображения ms.Refer для понимания этого RestrictfrequentCall. JPG